2016-07-28 72 views
0

我的應用程序中已經有一個數據庫使用第三方library。該庫似乎沒有刪除表功能。所以我想直接使用SQLiteOpenHelper API來改變它。這可能嗎?在Android中手動執行sql查詢

我創建了一個擴展SQLiteOpenHelper的類,併爲它提供與庫中使用的相同的db名稱。

public class SqliteDatabaseHelper extends SQLiteOpenHelper { 

    // Database Info 
    private static final String DATABASE_NAME = "myDatabase"; 
    private static final int DATABASE_VERSION = 1; 

    private Context context; 

    public SqliteDatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     L.w("old: " + oldVersion + ", " + "new: " + newVersion); 
     if (oldVersion != newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + "deals_latest"); 
      onCreate(db); 
      L.w("drop it like it's hot"); 
     } 
    } 
} 

我在Application類中初始化它,看它是否反映了我創建的db類。

SQLiteDatabase db = new SqliteDatabaseHelper(this).getReadableDatabase(); 
L.w("version: " + db.getVersion()); 
L.w("path: " + db.getPath()); 

SqliteDatabaseHelper helper = new SqliteDatabaseHelper(this); 
helper.onUpgrade(db, 1, 2); // this line suppose to invoke the drop table query 

當運行應用程序時,onUpgrade()方法似乎沒有被調用。

請注意,我從來沒有使用過本地SQLite幫手的經驗,所以我不知道這裏發生了什麼。我的目標只是查看onUpgrade中的查詢是否被執行。但該表仍然存在於數據庫中。

我該如何解決這個問題?

+0

如果您將代碼中的常量'DATABASE_VERSION'更改爲大於1的整數,則會調用onUpgrade()。至於你的原始問題,我仍然需要一些進一步的信息。 SQLiteHelper類和庫都可以訪問同一個數據庫,但必須注意活鎖和死鎖以及數據完整性。 – NitroNbg

+0

我明白了。謝謝(你的)信息。如果是這樣,我不需要明確地調用UpdateUp,只需更改DATABASE_VERSION,對嗎? – AimanB

+0

是的。下次你實例化SQLiteOpenHelper這個調用super(context,DATABASE_NAME,null,DATABASE_VERSION);檢查設備存儲上的數據庫是否與正在運行的應用程序需要的數據庫匹配。 – NitroNbg

回答

1

SQLiteOpenHelper類有助於管理您自己的數據庫版本。

將它用於由第三方代碼管理的數據庫沒有意義。

只需用openDatabase()直接打開數據庫即可。