Pertanyaan Bagaimana cara memeriksa apakah ada tabel dalam basis data SQLite Android?


Saya memiliki aplikasi android yang perlu memeriksa apakah sudah ada catatan dalam database, dan jika tidak, memproses beberapa hal dan akhirnya memasukkannya, dan cukup membaca data dari database jika datanya ada. Saya menggunakan subkelas dari SQLiteOpenHelper untuk membuat dan mendapatkan contoh SQLiteDatabase yang ditulis ulang, yang saya pikir secara otomatis mengurus pembuatan tabel jika belum ada (karena kode untuk melakukan itu ada di onCreate (... ) metode).

Namun, ketika tabel TIDAK belum ada, dan metode pertama berlari pada objek SQLiteDatabase yang saya miliki adalah panggilan untuk query (...), logcat saya menunjukkan kesalahan "I / Database (26434): sqlite kembali: kesalahan kode = 1, msg = tidak ada tabel seperti ini: appdata ", dan tentu saja, tabel appdata tidak dibuat.

Ada gagasan tentang mengapa?

Saya mencari metode untuk menguji apakah tabel itu ada (karena jika tidak, datanya pasti tidak ada di dalamnya, dan saya tidak perlu membacanya sampai saya menulisnya, yang sepertinya membuat tabel benar), atau cara untuk memastikan bahwa itu dibuat, dan hanya kosong, pada waktunya untuk panggilan pertama untuk query (...)

EDIT
Ini diposting setelah dua jawaban di bawah ini:
Saya pikir saya mungkin telah menemukan masalahnya. Saya untuk beberapa alasan memutuskan bahwa SQLiteOpenHelper yang berbeda seharusnya dibuat untuk setiap tabel, meskipun keduanya mengakses file database yang sama. Saya pikir refactoring kode itu untuk hanya menggunakan satu OpenHelper, dan membuat kedua tabel di dalamnya pada onCreate dapat bekerja lebih baik ...


75
2018-06-17 04:40


asal


Jawaban:


Coba yang ini:

public boolean isTableExists(String tableName, boolean openDb) {
    if(openDb) {
        if(mDatabase == null || !mDatabase.isOpen()) {
            mDatabase = getReadableDatabase();
        }

        if(!mDatabase.isReadOnly()) {
            mDatabase.close();
            mDatabase = getReadableDatabase();
        }
    }

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

113
2017-10-22 23:52



Saya tidak tahu apa-apa tentang Android SQLite API, tetapi jika Anda dapat berbicara langsung dengan SQL, Anda dapat melakukan ini:

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

Yang akan memastikan bahwa tabel selalu dibuat dan tidak membuang kesalahan jika sudah ada.


45
2018-06-17 04:47



Meskipun sudah ada banyak jawaban bagus untuk pertanyaan ini, saya menemukan solusi lain yang menurut saya lebih sederhana. Kelilingi kueri Anda dengan blok coba dan tangkapan berikut:

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.
    }
}

Itu berhasil untukku!


10
2017-08-15 09:07



Ini yang saya lakukan:

/* 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;

9
2017-09-21 19:01



Yap, ternyata teori dalam edit saya benar: masalah yang menyebabkan metode onCreate tidak berjalan, adalah fakta bahwa SQLiteOpenHelper objek harus merujuk ke database, dan tidak memiliki satu terpisah untuk setiap tabel. Pengemasan kedua tabel menjadi satu SQLiteOpenHelper memecahkan masalah.


7
2018-06-17 18:11



Anda menyebutkan bahwa Anda telah membuat kelas yang diperluas SQLiteOpenHelper dan menerapkan onCreate metode. Apakah Anda memastikan bahwa Anda melakukan semua panggilan akuisisi database Anda dengan kelas itu? Anda seharusnya hanya mendapatkan SQLiteDatabase objek melalui SQLiteOpenHelper#getWritableDatabase dan getReadableDatabase sebaliknya onCreate metode tidak akan dipanggil bila perlu. Jika Anda melakukan itu sudah periksa dan lihat apakah th SQLiteOpenHelper#onUpgrade metode dipanggil sebagai gantinya. Jika demikian, maka nomor versi basis data diubah pada beberapa titik waktu tetapi tabel tidak pernah dibuat dengan benar ketika itu terjadi.

Sebagai tambahan, Anda dapat memaksa rekreasi database dengan memastikan semua koneksi ke sana tertutup dan memanggil Context#deleteDatabaselalu menggunakan SQLiteOpenHelper untuk memberi Anda objek db baru.


2
2018-06-17 05:32



 // @param db, readable database from SQLiteOpenHelper

 public boolean doesTableExist(SQLiteDatabase db, String tableName) {
        Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null);

    if (cursor != null) {
        if (cursor.getCount() > 0) {
            cursor.close();
            return true;
        }
        cursor.close();
    }
    return false;
}
  • sqlite mempertahankan tabel sqlite_master yang berisi informasi dari semua tabel dan indeks dalam basis data.
  • Jadi di sini kita hanya menjalankan perintah SELECT di atasnya, kita akan mendapatkan kursor yang memiliki hitungan 1 jika tabel ada.

1
2017-07-11 14:13



 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;
}

0
2017-09-03 07:22



no such table exists: error akan datang karena setelah Anda membuat database dengan satu tabel setelah itu setiap kali Anda membuat tabel di database yang sama, ini memberikan kesalahan ini.

Untuk mengatasi kesalahan ini Anda harus membuat database baru dan di dalam metode onCreate () Anda dapat membuat beberapa tabel dalam database yang sama.


0
2017-09-07 10:10