文章出處
文章列表
2016-03-16
Android數據庫支持
- 學習Android對SQL的支持。
- 理解在Java中使用SQL——通過SQLiteDatabase類。
- 創建數據庫——SQLiteOpenHelper類。
- 理解loaders、cursors和adapters。
- 在java代碼中嵌套SQL命令,程序運行時執行它們。
- 根據需要創建,初始化,并升級數據庫。
- 選擇一種針對當前程序的數據庫生命周期管理策略。
- 解析查詢得到的數據,在程序中使用它們。
Java中執行SQL:SQLiteDatabase類
db.execSQL(String sql)
- 那些以“.”開頭的命令只能在命令行執行,它們是sqlite3 命令行工具,不是execSQL可執行的SQL語句。
- execSQL每次只能執行一個有效的SQL語句。
- execSQL的執行不能返回任何數據,如果在這里傳遞一個query作為sql語句,那么會引起SQLiteException異常。
db.rawQuery(String sql)
Cursor c = db.rawQuery("pragma table_info(" + tableName + ")", null);
SQL語句的等價API
delete
db.delete("pets", "age > 10 AND age < 20", null);
db.delete("pets", "age = ? OR name = ?", new String[] {"15", "linus"});
update
ContentValues newAges = new ContentValues();
newAges.put("age", Integer.valueOf(99));
db.update(
"pets",
newAges,
"name = ? OR name = ?",
new String[] {"linus", "fellini"});
insert
ContentValues newPet = new ContentValues();
newPet.put("name", "luna");
newPet.put("age", 99);
db.insert("pets", null, newPet);
replace
query
SELECT table1.name, sum(table2.price)
FROM table1, table2
WHERE table1.supplier = table2.id AND table1.type = "spigot"
GROUP BY table1.name
HAVING sum(table2.price) < 50
ORDER BY table1.name ASC
LIMIT 100
Cursor c = db.query(
"pets",
new String[] { "name", "age" },
"age > ?",// selection
new String[] { "50" },//selectionArgs
null, // group by
null, // having
"name ASC");
外鍵約束和事務
db.beginTransaction();
try {
// sql...
db.setTransactionSuccessful();
}
finally {
db.endTransaction();
}
創建數據庫:使用SQLiteOpenHelper
數據庫版本
onConfigure和onOpen
- onConfigure 方法在數據庫連接成功后立即執行——在onCreate、onUpgrade和onDowngrade方法的前面。此處執行setForeignKeyConstraintsEnabled會強制約束生效——對于數據庫的整個操作過程。
- onOpen 方法在onCreate、onUpgrade和onDowngrade之后執行,使得這三個和數據庫結構創建和修改的方法的執行可以更自由和快速。例如像簡單的改表名這樣的操作,應該暫時無視外鍵約束。onOpen方法在數據庫結構完全初始化之后執行,那么此處執行setForeignKeyConstraintsEnabled方法,可以讓外鍵約束在數據庫結構初始化完成后才生效。
數據庫對象的管理
- 獲得并一直持有db對象(Get it and keep it)。
- 僅在需要的時候獲取并使用db對象(Get it when you need it)。
一直持有db對象
09-02 15:27:10.286: E/SQLiteDatabase(16433): close() was never explicitly called on
database '/data/data/net.callmeike.android.sqlitetest/databases/test.db'
09-02 15:27:10.286: E/SQLiteDatabase(16433): android.database.sqlite.
DatabaseObjectNotClosedException: Application did not close the cursor or database
object that was opened here
09-02 15:27:10.286: E/SQLiteDatabase(16433): at android.database.sqlite.SQLiteD
atabase.<init>(SQLiteDatabase.java:1943)
09-02 15:27:10.286: E/SQLiteDatabase(16433): at android.database.sqlite.
SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
...
09-02 15:27:10.286: E/System(16433): Uncaught exception thrown by finalizer
09-02 15:27:10.297: E/System(16433): java.lang.IllegalStateException: Don't have
database lock!
public class KeyValApplication extends Application {
private KeyValHelper dbHelper;
private Thread uiThread;
@Override
public void onCreate() {
super.onCreate();
// ...
uiThread = Thread.currentThread();
dbHelper = new KeyValHelper(this);
}
public SQLiteDatabase getDb() {
if (Thread.currentThread().equals(uiThread)) {
throw new RuntimeException("Database opened on main thread");
}
return dbHelper.getWriteableDatabase();
}
}
Cursor & Loader & Adapter
文章列表
全站熱搜