update - android studio sqlite




如何檢查Android SQLite數據庫中是否存在表格? (7)

我有一個android應用程序需要檢查數據庫中是否有記錄,如果沒有,處理一些事情並最終插入它,並且只要數據存在就從數據庫讀取數據。 我使用SQLiteOpenHelper的子類來創建並獲取SQLiteDatabase的可重寫實例,如果它不存在,我認為它會自動處理創建表(因為執行該操作的代碼位於onCreate(...)中。 ) 方法)。

但是,當表尚不存在,並且第一個方法運行SQLiteDatabase對像我有一個調用查詢(...),我的logcat顯示“我/數據庫(26434)的錯誤:sqlite返回:錯誤代碼= 1,msg =沒有這樣的表:appdata“,果然,appdata表沒有被創建。

任何想法為什麼?

我正在尋找一種方法來測試表是否存在(因為如果它不存在,數據當然不在其中,我不需要讀取它,直到我寫入它,這似乎創建表正確地),或者確保它被創建並且只是空的,以便第一次調用查詢(...)

編輯
這是後面的兩個答案發布:
我想我可能已經找到了問題。 出於某種原因,我決定為每個表創建一個不同的SQLiteOpenHelper,儘管它們都訪問同一個數據庫文件。 我認為重構該代碼只使用一個OpenHelper,並在其onCreate中創建兩個表可能會更好...


..... Toast t = Toast.makeText(context,“try ...”,Toast.LENGTH_SHORT); t.show();

    Cursor callInitCheck = db.rawQuery("select count(*) from call", null);

    Toast t2a = Toast.makeText(context, "count rows " + callInitCheck.getCount() , Toast.LENGTH_SHORT);
    t2a.show();

    callInitCheck.moveToNext();
    if( Integer.parseInt( callInitCheck.getString(0)) == 0) // if no rows then do
    {
        // if empty then insert into call

.....


no such table exists: error即將到來,因為一旦您在一個表中創建數據庫後,每當您在同一數據庫中創建表時,它都會出現此錯誤。

要解決此錯誤,您必須創建新的數據庫,並且在onCreate()方法內,您可以在同一個數據庫中創建多個表。


我對Android SQLite API一無所知,但如果您能夠直接在SQL中與它交談,則可以這樣做:

create table if not exists mytable (col1 type, col2 type);

這將確保表格始終創建,如果已經存在,不會拋出任何錯誤。


是的,原來我編輯中的理論是正確的:導致onCreate方法不運行的問題是, SQLiteOpenHelper對象應該引用數據庫,並且每個表都沒有單獨的對象。 將兩個表打包成一個SQLiteOpenHelper解決了這個問題。


這就是我所做的:

/* open database, if doesn't exist, create it */
SQLiteDatabase mDatabase = openOrCreateDatabase("exampleDb.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);

Cursor c = null;
boolean tableExists = false;
/* get cursor on it */
try
{
    c = mDatabase.query("tbl_example", null,
        null, null, null, null, null);
        tableExists = true;
}
catch (Exception e) {
    /* fail */
    Log.d(TAG, tblNameIn+" doesn't exist :(((");
}

return tableExists;

雖然這個問題已經有很多很好的答案,但我想出了另一個我認為更簡單的解決方案。 用try塊和下面的catch語句圍繞你的查詢:

catch (SQLiteException e){
    if (e.getMessage().contains("no such table")){
            Log.e(TAG, "Creating table " + TABLE_NAME + "because it doesn't exist!" );
            // create table
            // re-run query, etc.
    }
}

它為我工作!


 public boolean isTableExists(String tableName) {
    boolean isExist = false;
    Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null);
    if (cursor != null) {
        if (cursor.getCount() > 0) {
            isExist = true;
        }
        cursor.close();
    }
    return isExist;
}




sqlite