Pertanyaan Bagaimana cara memeriksa SQLite apakah ada tabel?


Bagaimana saya, andal, periksa di SQLite, apakah ada tabel pengguna tertentu?

Saya tidak meminta cara yang tidak dapat diandalkan seperti memeriksa apakah "pilih *" di atas meja mengembalikan kesalahan atau tidak (apakah ini ide yang bagus?).

Alasannya seperti ini:

Dalam program saya, saya perlu membuat dan kemudian mengisi beberapa tabel jika mereka belum ada.

Jika mereka sudah ada, saya perlu memperbarui beberapa tabel.

Haruskah saya mengambil beberapa jalur lain sebagai pengganti sinyal bahwa tabel yang dimaksud telah dibuat - katakanlah misalnya, dengan membuat / meletakkan / menetapkan bendera tertentu di file inisialisasi / pengaturan program saya di disk atau sesuatu?

Atau apakah pendekatan saya masuk akal?


759
2017-10-21 14:22


asal


Jawaban:


Saya melewatkan entri FAQ tersebut.

Bagaimanapun, untuk referensi di masa mendatang, pertanyaan lengkapnya adalah:

SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';

Dimana {table_name} adalah nama tabel untuk diperiksa.

Bagian dokumentasi untuk referensi: Format File Database. 2.6. Penyimpanan Dari Skema Database SQL


865
2017-10-21 22:57



Jika Anda menggunakan SQLite versi 3.3+ Anda dapat dengan mudah membuat tabel dengan:

create table if not exists TableName (col1 typ1, ..., colN typN)

Dengan cara yang sama, Anda dapat menghapus tabel hanya jika ada dengan menggunakan:

drop table if exists TableName

481
2018-03-05 17:36



Variasi akan menggunakan SELECT COUNT (*) daripada SELECT NAME, yaitu.

SELECT count(*) FROM sqlite_master WHERE type='table' AND name='table_name';

Ini akan mengembalikan 0, jika tabel tidak ada, 1 jika tidak. Ini mungkin berguna dalam pemrograman Anda karena hasil numerik lebih cepat / lebih mudah untuk diproses. Berikut ini menggambarkan bagaimana Anda akan melakukan ini di Android menggunakan SQLiteDatabase, Cursor, rawQuery dengan parameter.

boolean tableExists(SQLiteDatabase db, String tableName)
{
    if (tableName == null || db == null || !db.isOpen())
    {
        return false;
    }
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName});
    if (!cursor.moveToFirst())
    {
        cursor.close();
        return false;
    }
    int count = cursor.getInt(0);
    cursor.close();
    return count > 0;
}

155
2018-01-11 22:20



Kamu bisa mencoba:

SELECT name FROM sqlite_master WHERE name='table_name'

38
2017-10-21 14:25



Jika Anda mendapatkan kesalahan "tabel sudah ada", buat perubahan dalam string SQL seperti di bawah ini:

CREATE table IF NOT EXISTS table_name (para1,para2);

Dengan cara ini Anda dapat menghindari pengecualian.


34
2017-10-20 11:46



Nama tabel SQLite tidak peka huruf kapital, tetapi perbandingan peka huruf besar secara default. Untuk membuat ini berfungsi dengan benar dalam semua kasus yang perlu Anda tambahkan COLLATE NOCASE.

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name' COLLATE NOCASE

26
2018-02-21 20:26



Menggunakan:

PRAGMA table_info(your_table_name)

Jika tabel yang dihasilkan kosong maka your_table_name tidak ada.

Dokumentasi:

PRAGMA schema.table_info (nama tabel);

Pragma ini mengembalikan satu baris untuk setiap kolom dalam tabel bernama. Kolom di set hasil termasuk nama kolom, tipe data, apakah kolom dapat NULL, dan nilai default untuk kolom. Kolom "pk" dalam kumpulan hasil adalah nol untuk kolom yang bukan bagian dari kunci primer, dan merupakan indeks kolom di kunci primer untuk kolom yang merupakan bagian dari kunci utama.

Tabel yang disebutkan dalam tabel_info pragma juga bisa berupa tampilan.

Contoh keluaran:

cid|name|type|notnull|dflt_value|pk
0|id|INTEGER|0||1
1|json|JSON|0||0
2|name|TEXT|0||0

26
2017-09-29 18:06



Lihat ini:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

25
2017-10-21 14:25



Jika Anda menggunakan fmdbSaya pikir Anda bisa saja impor FMDatabaseAdditions dan gunakan fungsi bool:

[yourfmdbDatabase tableExists:tableName].

22
2018-04-06 04:46



Kode berikut mengembalikan 1 jika tabel ada atau 0 jika tabel tidak ada.

SELECT CASE WHEN tbl_name = "name" THEN 1 ELSE 0 END FROM sqlite_master WHERE tbl_name = "name" AND type = "table"

13
2017-08-08 13:50