2014-10-20 3 views
0

Из-за какой-то причине SQLite только создает две таблицы вместо 4. Я использую этот код:SQLite создает только 2 таблицы

@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    String TABLE_RECEIPT   = "CREATE TABLE RECEIPT (receiptId INTEGER PRIMARY KEY AUTOINCREMENT, receiptDate INTEGER); "; 
    db.execSQL(TABLE_RECEIPT); 

    String TABLE_PRODUCT   = "CREATE TABLE PRODUCT (productId INTEGER PRIMARY KEY AUTOINCREMENT, productName TEXT NOT NULL, productImagePath TEXT, productPrice REAL NOT NULL);"; 
    db.execSQL(TABLE_PRODUCT); 

    String TABLE_RECEIPT_RULE  = "CREATE TABLE RECEIPT_RULE (receiptId INTEGER NOT NULL, productId INTEGER NOT NULL, ruleAmount INTEGER NOT NULL, PRIMARY KEY (receiptId, productId), FOREIGN KEY(receiptId) REFERENCES RECEIPT(receiptId), FOREIGN KEY(productId) REFERENCES PRODUCT(productId));"; 
    db.execSQL(TABLE_RECEIPT_RULE); 

    String TABLE_PRODUCT_ATTRIBUTES = "CREATE TABLE PRODUCT_ATTRIBUTES (productId INTEGER NOT NULL, attributeName TEXT NOT NULL, attributeValue TEXT NOT NULL, PRIMARY KEY (productId, attributeName), FOREIGN KEY(productId) REFERENCES PRODUCT(productId));"; 
    db.execSQL(TABLE_PRODUCT_ATTRIBUTES); 

    Log.i(Config.TAG, "Recreated database"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    String TABLE_PRODUCT   = "DROP TABLE PRODUCT;"; 
    String TABLE_RECEIPT   = "DROP TABLE RECEIPT;"; 
    String TABLE_RECEIPT_RULE  = "DROP TABLE RECEIPT_RULE;"; 
    String TABLE_PRODUCT_ATTRIBUTES = "DROP TABLE PRODUCT_ATTRIBUTES;"; 

    db.execSQL(TABLE_PRODUCT); 
    db.execSQL(TABLE_RECEIPT); 
    db.execSQL(TABLE_RECEIPT_RULE); 
    db.execSQL(TABLE_PRODUCT_ATTRIBUTES); 
    onCreate(db); 
} 

В сообщении Recreated database видно, поэтому он попытается создать все таблицы. Он не показывает никакой ошибки.

Я не знаю, если это полезно, но я читаю существующие таблицы с кодом ниже:

//Placed in SQLiteStorage 
public Cursor showAllTables(){ 
    String mySql = " SELECT name FROM sqlite_master " + " WHERE type='table'    " 
      + " AND name LIKE 'PR_%' "; 
    return db.rawQuery(mySql, null); 
} 

//In Activity, create the storage and calls the function 
Cursor c = new SQLiteStorage(this).showAllTables(); 
if (c.moveToFirst()) 
{ 
    while(!c.isAfterLast()) 
    { 
     Log.i(Config.TAG, c.getString(0)); 
     c.moveToNext(); 
    } 
} 
+0

похоже, что если будет отсутствовать таблицы, будет ошибка. Можете ли вы попробовать попробовать .. поймать там, чтобы увидеть, если он попадает в ошибку, которая может быть проглочена? –

ответ

4

В вашей showAllTable функции, вы выбираете все таблицы, которые начинаются так только с PR таблица продуктов и таблицы атрибутов продукта отображаются в вашем запросе.

изменение

Строка MYSQL = "SELECT имя FROM sqlite_master" + "где тип = 'Таблица'" + "и имя LIKE 'PR_%'";

к

Строка MYSQL = "SELECT имя ОТ sqlite_master" + "где тип = 'таблицы'";

+0

Ха-ха, на самом деле этого не видел. Опасность копирования/вставки. Благодаря! –