編輯:關於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自帶日志的作用先聲明一個字符串 private static final String TAG = &qu
android視頻播放主要是兩種方式1、系統封裝好的videoplayer,有前進、後退、暫停/播放、拉動最基本的功能,夠一般使用,操作辦法也很簡單,如果需要自定義程度高
看到這個sweet-alert-dialog很親切,因為前端開發本人用的提示就是這個js插件,java牛人很厲害,直接弄成一個java包插件,Good!下面記錄如何引用到