編輯:關於Android編程
數據庫的創建
1.寫一個類繼承SQLiteOpenHelper(構造,onCreate,onUpgrade)
/**
*數據庫的幫助類
*要創建數據庫操作的對象,必須借助幫助類對象
*/
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context, String name, CursorFactory factory,
int version) {
super(context,// 數據庫幫助類要依賴的上下文對象
name,// 數據庫文件的名字(不是表名)數據庫的名字,後綴名可加可不加
factory,// 游標工廠,用來創建數據,一般為空
version);// 數據庫的版本號,從1開始
}
@Override
/**
*在第一次 創建數據庫的調用,在此方法中一般用於創建表和初始化表中的數據
*db:數據庫的操作對象
*/
public void onCreate(SQLiteDatabase db) {
String sqlcreate="create table student (_id integer primary key autoincrement," +
" name varchar(20)," +
"age integer) ";
db.execSQL(sqlcreate);
}
@Override
/**
* 數據庫版本升級的時候調用
* db:數據庫操作的對象
* oldVersion:數據庫的舊版本號
* newVersion: 數據庫的新版本號
*/
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion>oldVersion) {
// 刪除舊表,創建新表
db.execSQL("drop table if exists student ");
onCreate(db);
}
}
}
2.獲取到一個數據庫的操作對象
// 版本號不能降低,只能增加,可以跳躍增加
helper=new MyHelper(this, DB_NAME, null, 2);
// 獲取到一個可讀可寫的數據庫對象,得到數據對象的時候就會去調用Helper中的部分方法,若磁盤空間滿,會產生異常
db=helper.getWritableDatabase();
// 獲取到的也是一個可讀可寫的數據庫對象,但在特殊情況下eg:磁盤空間滿了,該數據庫對象變成只讀的了
db=helper.getReadableDatabase();
數據庫的第一種增刪改查(使用SQL語句)
public class MainActivity extends Activity {
private SQLiteDatabase db;
private MyHelper helper;
private static final String DB_NAME="first.db";//數據庫的名字,後綴名可加可不加
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView) findViewById(R.id.textview);
// 版本號不能降低,只能增加,可以跳躍增加
helper=new MyHelper(this, DB_NAME, null, 2);
// 獲取到一個可讀可寫的數據庫對象
db=helper.getWritableDatabase();
// 獲取到的也是一個可讀可寫的數據庫對象,但在特殊情況下eg:磁盤空間滿了,該數據庫對象變成只讀的了
db=helper.getReadableDatabase();
// insertData();
// deleteData();
// updateData();
selectData();
}
/**
* 插入數據
*/
public void insertData(){
String sql="insert into student( name,age) values ('name1',18)";
db.execSQL(sql);
// 推薦使用
db.execSQL("insert into student( name,age) values (?,?)", new Object[]{"name2",19});
}
/**
* 刪除數據
*/
public void deleteData(){// 下面的三條語句等效
db.execSQL("delete from student where _id = 2");
// db.execSQL("delete from student where _id = ? ", new Object[]{2});
// db.execSQL("delete from student where _id = 2", null);
}
// 修改數據
public void updateData(){
db.execSQL("update student set name='qqq',age=25 where _id=3 ");
db.execSQL("update student set name= ? ,age= ? where _id= ? ",new Object[]{"www",29,4});
}
// 查詢數據
public void selectData(){
Cursor cursor = db.rawQuery("select name,age from student ",null);
// Cursor cursor = db.rawQuery("select name,age from student where age= ?",new String[]{"25"});
//cursor.moveToNext(): 讓游標依次向下一行移動,如果下一行有數據返回true,沒有數據返回false
while(cursor.moveToNext()){
/*查詢方式一:
* //根據查詢出一行裡面name所在的列號(從0開始一次增加),列號與查詢的字段相對應
String name = cursor.getString(0);
int age=cursor.getInt(1);
textView.append(name+"="+age);*/
//查詢方式二:
//根據列名獲取到列號,後續的就不用改變,推薦使用
int nameIndex = cursor.getColumnIndex("name");
int ageIndex = cursor.getColumnIndex("age");
String name = cursor.getString(nameIndex);
int age=cursor.getInt(ageIndex);
}
}
數據庫的第二種增刪改查(使用Android的方法)
建表語句
db.execSQL("create table food (_id integer primary key autoincrement," +
"name varchar ," +
"price varchar(10))");
插入數據
private void insertApi(){
/*
* 參數解釋insert(table, nullColumnHack, values)==>()
* table:表名
* nullColumnHack:沒有插入字段的默認值
* values:要添加的數據,ContentValues的對象,通過put放數據,鍵為字段名,值為插入值
* 返回值:插入數據的行號id,返回-1表插入數據失敗
* */
for (int i = 0; i < 20; i++) {
ContentValues values=new ContentValues();
values.put("name", "apple"+i);
values.put("price", "5.5"+i);
long rowId = db.insert(TABLE_NAME, null, values);
if (rowId==-1) {
Log.e("info", "插入數據失敗==="+i);
}
}
}
刪除數據
private void delectApi() {
/*
* db.delete(table, whereClause, whereArgs)
* table: 表名
* whereClause: sql語句中的where後面的賽選條件(不寫關鍵字where)
* whereArgs: 如果賽選條件有?,這就是賽選條件的具體值
* 返回值:刪除的行數,若等於0,表示刪除失敗
* 注:如果沒有where賽選條件whereClause和whereArgs為 null
* */
//db.execSQL("delete from table food where name =? ",new String[]{"apple1"});等價
int rows = db.delete(TABLE_NAME, "name = ? ", new String[]{"apple1"});
if (rows>0) {
Toast.makeText(this, "刪除成功,共刪除"+rows+"條數據!", 1).show();
}else {
Toast.makeText(this, "刪除失敗", 1).show();
}
}
修改數據
private void updataApi(){
/*如果沒有賽選條件,最後兩個可以填 null
* db.update(table, values, whereClause, whereArgs);
* table:表名
* values: 要修改的數據,ContentValues的對象,通過put放數據,鍵為字段名,值為插入值
* whereClause: sql語句中的where後面的賽選條件(不寫關鍵字where)
* whereArgs: 如果賽選條件有?,這就是賽選條件的具體值,為String 的數組
* 返回值: 修改數據受影響的行數,
* */
// db.execSQL("update food set price =100.0 where _id =15 ");
ContentValues values=new ContentValues();
values.put("price", "100.0");
int rows = db.update(TABLE_NAME, values, " _id = ? ", new String[]{"15"});
if (rows>0) {
Toast.makeText(this, "修改成功,共修改"+rows+"條數據!", 1).show();
}else {
Toast.makeText(this, "沒有修改到數據", 1).show();
}
}
查詢數據
private void selectApi() {
/*sql="select name,price from food where name = apple1 "
* db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
* table: 表名
* columns: 要查詢的字段,String的數組
* selection: 賽選條件的where語句(不寫關鍵字where了)
* selectionArgs: 如果賽選條件有,這裡為賽選條件的值
* 以下三個參數沒有就填null
* groupBy: 分組
* having: 分組的條件
* orderBy: 排序方式
* */
/*sql=" select name,price,_id from limit "0,10" "
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy,
limit);分頁查詢使用,eg: "1,10" 1:代表開始查詢的位置,10:查詢的數量,結果就是從1位置開始查詢,查詢出10條數據
* */
cursor=db.query(TABLE_NAME,
new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
Cursor cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
"name=?", new String[]{"apple2"}, null, null, null);
// 相當於 select * from food
cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String price = cursor.getString(cursor.getColumnIndex("price"));
int id = cursor.getInt(cursor.getColumnIndex("_id"));
textView.append(name+",="+price+",="+id+"=======\n");
}
}
分頁查詢
/*sql=" select name,price,_id from limit "0,10" "
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy,
limit);分頁查詢使用,eg: "1,10" 1:代表開始查詢的位置,10:查詢的數量,結果就是從1位置開始查詢,查詢出10條數據
* */
cursor=db.query(TABLE_NAME,
new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
數據庫適配器SimpleCursorAdapter
/*數據的適配器,不用創建java bean對象,不用自定義適配器
* new SimpleCursorAdapter(context, 上下文
* layout: 每個item要展示的布局文件
* c: 數據源,查詢數據庫的時候得到的cursor游標
* from: 數據獲取的來源,表的字段數組
* to: 數據的去處,item布局的控件id的數組
* flags: 標記,
標記有CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER : 2 和 CursorAdapter.FLAG_AUTO_REQUERY : 1
* 交換數據源,可以換新的數據源:simpleCursorAdapter.swapCursor(cursor);
* )*/
simpleCursorAdapter=new SimpleCursorAdapter(this,
R.layout.item,
null, new String[]{"_id","name","price"},
new int[]{R.id.item_id,R.id.item_name,R.id.item_price},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(simpleCursorAdapter);
// 交換數據源,可以換新的數據源
//simpleCursorAdapter.swapCursor(cursor);
simpleCursorAdapter.changeCursor(cursor);//也是交換數據源,會自動關閉老的cursor,推薦使用
Cursor類
getColumnCount():獲取到查詢後表中的字段列數
getCount():行數
getColumnIndex(String columnName):獲取到指定字段名的下標位置
getColumnName(int columnIndex):根據列號得到列名
getType(int columnIndex) :得到指定列數的類型
FIELD_TYPE_NULL :null
FIELD_TYPE_INTEGER :integer
FIELD_TYPE_FLOAT :float
FIELD_TYPE_STRING :string
FIELD_TYPE_BLOB :blob
getLong(int columnIndex) :得到指定列號的long數據
getString(int columnIndex) :得到指定列號的string數據
isNull(int columnIndex) :判斷指定列號是否為null
boolean moveToNext() :移動游標到下一行,若下行有數據返回true
數據庫事務
4 數據庫的事務
事務: 執行多條sql語句,要麼同時執行成功,要麼同時執行失敗,不能有的成功,有的失敗
銀行轉賬
//點擊按鈕執行該方法
public void transtation(View v){
//1.創建一個幫助類的對象
BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
//2.調用數據庫幫助類對象的getReadableDatabase創建數據庫,初始化表數據,獲取一個SqliteDatabase對象去做轉賬(sql語句)
SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
//3.轉賬,將李四的錢減200,張三加200
db.beginTransaction();//開啟一個數據庫事務
try {
db.execSQL("update account set money= money-200 where name=?",new String[]{"李四"});
int i = 100/0;//模擬一個異常
db.execSQL("update account set money= money+200 where name=?",new String[]{"張三"});
db.setTransactionSuccessful();//標記事務中的sql語句全部成功執行
} finally {
db.endTransaction();//判斷事務的標記是否成功,如果不成功,回滾錯誤之前執行的sql語句
}
}
如何做智能硬件開發 -- 直流馬達
第6節 直流馬達馬達是我們經常使用到的電動裝置,它可以將電能轉化成動能,驅動其他東西的運動。聽起來很抽象,舉幾個例子吧。我們小時候玩的四驅車,帶動輪子轉動的那個小裝置就是
Android日志Log
日志可以在幫我們開發中調試程序,下面看看Android自帶日志的作用先聲明一個字符串 private static final String TAG = &qu
android視頻播放心得體會
android視頻播放主要是兩種方式1、系統封裝好的videoplayer,有前進、後退、暫停/播放、拉動最基本的功能,夠一般使用,操作辦法也很簡單,如果需要自定義程度高
sweet alert dialog 在android studio應用問題說明詳解
看到這個sweet-alert-dialog很親切,因為前端開發本人用的提示就是這個js插件,java牛人很厲害,直接弄成一個java包插件,Good!下面記錄如何引用到