Android数据存储之SQLite
概覽
l ?概述
l ?
CRUD方法詳解
l ?注意事項
?
概述
對于大量數據的處理,如果不想將數據存于服務器端,Android API提供了對關系數據庫SQLite的支持,在android-SDK中tool目錄下已經提供了SQLite的應用程序,用于管理數據庫中的數據。當android應用使用SQLite進行數據存儲的時候,SQLite數據庫是以文件的形式存放在SD卡中的。
?
Android API提供了SQLiteDataBase和SQLiteOpenHelp這兩個類支持數據的CRUD操作。其中SQLiteOpenHelp對數據庫創建、連接管理、版本更新進行了封裝。SQLiteDataBase提拱了豐富的增、刪、改、查的方法。
?
CRUD方法詳解
l ?新建數據庫
1. ? ? ? ?繼承SQLiteOpenHelp,重寫OnCreate()方法:
?
public class DictionaryOpenHelper extends SQLiteOpenHelper { ? ? private static final int DATABASE_VERSION = 2; ? ?private static final String DICTIONARY_TABLE_NAME = "dictionary"; ? ?private static final String DICTIONARY_TABLE_CREATE = ? ? ? ? ? ? ? ?"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + ? ? ? ? ? ? ? ?KEY_WORD + " TEXT, " + ? ? ? ? ? ? ? ?KEY_DEFINITION + " TEXT);"; ? ? DictionaryOpenHelper(Context context) { ? ? ? ?super(context, DATABASE_NAME, null, DATABASE_VERSION); ? ?} ? ? @Override ? ?public void onCreate(SQLiteDatabase db) { ? ? ? ?db.execSQL(DICTIONARY_TABLE_CREATE); ? ?}}
另外值得注意的是,SQLiteOpenHelp類提供的另一個需要重寫的方法OnUpgrade(),用于對。
2. ? ? ? ?對于繼承的SQLiteOpenHelp之后得到的實例,通過getReadableDatabase()和getWritableDatabase()返回一個sqLiteDatabase實例實現對數據庫的讀與寫的相關操作。
SQLiteDataBase ?sqLiteDatabase = sqliteOpenHelp. getReadableDatabase ();SQLiteDataBase ?sqLiteDatabase = sqliteOpenHelp.getWritableDatabase();
?
3. ? ? ? ?sqLiteDatabase類提供的主要方法:
execSQL(String sql)Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data. execSQL(String sql, Object[] bindArgs)Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE. insert(String table, String nullColumnHack, ContentValues values)Convenience method for inserting a row into the database. rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)Runs the provided SQL and returns a Cursor over the result set. rawQuery(String sql, String[] selectionArgs)Runs the provided SQL and returns a Cursor over the result set.
?
l ?插入數據
ContentValues cv = new ContentValues();?? ??? ?cv.put("name",user.getName());?? ??? ?cv.put("password", user.getPassword());?? ??? ?sqLiteDatabase.insert("user", null,cv);
?
l ?查詢數據
查詢所有數據:
sqLiteDatabase = dbHelper.getReadableDatabase();?? ??? ?Cursor cursor = sqLiteDatabase.rawQuery("select * from user;", null);?? ??? ?while(cursor.moveToNext()){?? ??? ??? ?user = new User();?? ??? ??? ?user.setName(cursor.getString(cursor.getColumnIndex("name")));?? ??? ??? ?user.setPassword(cursor.getString(cursor.getColumnIndex("password")));?? ??? ??? ?list.add(user);?? ??? ?}
?
按ID查詢:
User user = new User();?? ??? ?String[] selectionArgs = {String.valueOf(id)};?? ??? ?try {?? ??? ?sqLiteDatabase = dbHelper.getReadableDatabase();?? ??? ?Cursor cursor = sqLiteDatabase.rawQuery("select * from user where _ID=?",selectionArgs);?? ??? ?while(cursor.moveToNext()){?? ??? ??? ?user.setName(cursor.getString(cursor.getColumnIndex("name")));?? ??? ??? ?user.setPassword(cursor.getString(cursor.getColumnIndex("password")));?? ??? ?}
?
l ?修改數據
sqLiteDatabase = dbHelper.getWritableDatabase();?? ??? ??? ?String[] whereArgs = {String.valueOf(user.get_ID())};?? ??? ??? ?ContentValues cv = new ContentValues();?? ??? ??? ?cv.put("name", user.getName());?? ??? ??? ?cv.put("password", user.getPassword());?? ??? ??? ?sqLiteDatabase = dbHelper.getReadableDatabase();?? ??? ??? ?sqLiteDatabase.update("user", cv, "_ID=?", whereArgs);
?
l ?刪除數據
String[] whereArgs = {String.valueOf(id)};?? ??? ??? ?sqLiteDatabase = dbHelper.getWritableDatabase();?? ??? ??? ?sqLiteDatabase.delete("user", "_ID=?", whereArgs);
?
l ?值得注意的是,execSQL方法也可以實現上述某些功能,不過根據API,該方法說明如下:
public void execSQL(String sql, Object[] bindArgs) Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE.
官方的建議是不能用此方法執行SELECT/INSERT/UPDATE/DELETE操作:
For INSERT statements, use any of the following instead.?
?insert(String, String, ContentValues)
?insertOrThrow(String, String, ContentValues)
?insertWithOnConflict(String, String, ContentValues, int)
?For UPDATE statements, use any of the following instead.?
?update(String, ContentValues, String, String[])
?updateWithOnConflict(String, ContentValues, String, String[], int)
?For DELETE statements, use any of the following instead.?
?delete(String, String, String[])
?For example, the following are good candidates for using this method:?
?ALTER TABLE
?CREATE or DROP table / trigger / view / index / virtual table
?REINDEX
?RELEASE
?SAVEPOINT
?PRAGMA that returns no data
實現如下:
?
實現如下:
?
增加數據:
Object[]bindArgs = {user.getName(),user.getPassword()};
sqLiteDatabase.execSQL("insert into uservalues(null,?,?);", bindArgs);
?
修改數據:
Object[]whereArgs = {user.getName(),user.getPassword(),String.valueOf(user.get_ID())};
sqLiteDatabase.execSQL("update user setname=?,password=? where _ID=?", whereArgs);
?
刪除數據:
String[]whereArgs = {String.valueOf(id)};
sqLiteDatabase.execSQL("delete from user where _ID =?;", whereArgs);
?
注意事項
l ?每次事物處理完成后務必記得關閉數據庫
l ?
SQLite不支持多線程。支持同時打開、讀數據庫,但是不能同時寫。可以通過讀寫鎖來控制多線程的寫操作。
?
總結
以上是生活随笔為你收集整理的Android数据存储之SQLite的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread.interrupt()方法
- 下一篇: Android USB 开发详解