2016-03-04 61 views
0

我正在做一個Android項目,我使用的數據庫超過1表。我第一次嘗試用一張桌子,一切正常,但當我使用第二張桌子時,我有一個錯誤。
下面是代碼:
這部分工作完全正常:SQLite沒有這樣的表錯誤,當使用2表

public class MarqueDBHelper extends SQLiteOpenHelper { 

public static final String DATABASE_NAME = "reprise.db"; 
public static final int DATABASE_VERSION = 3; 

private static final String SQL_CREATE_ENTRIES = "create table marque (name text primary key)"; 
private static final String SQL_DELETE_ENTRIES = "drop table if exists marque"; 

public MarqueDBHelper(Context context){ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 

} 

public void onCreate(SQLiteDatabase db){ 
    db.execSQL(SQL_CREATE_ENTRIES); 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    db.execSQL(SQL_DELETE_ENTRIES); 
    onCreate(db); 
} 
} 

這一個不:

public class ModeleDBHelper extends SQLiteOpenHelper { 

public static final String DATABASE_NAME = "reprise.db"; 
public static final int DATABASE_VERSION = 3; 

private static final String SQL_CREATE_ENTRIES = "create table modele (name text primary key)"; 
private static final String SQL_DELETE_ENTRIES = "drop table if exists modele"; 

public ModeleDBHelper(Context context){ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 

} 

public void onCreate(SQLiteDatabase db){ 
    db.execSQL(SQL_CREATE_ENTRIES); 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    db.execSQL(SQL_DELETE_ENTRIES); 
    onCreate(db); 
} 
} 

,當我在這裏做一個插入時出現錯誤:

public class ModeleDAO { 
private Context context; 
private ModeleDBHelper modeleHelper; 
private SQLiteDatabase db; 

public ModeleDAO(Context context){ 
    this.context=context; 
} 

public void addMarque(ArrayList<Modele> marqueListe){ 
    modeleHelper = new ModeleDBHelper(context); 
    db = modeleHelper.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    for(Modele str : marqueListe){ 
     values.put("name", str.getNom()); 
     db.insertWithOnConflict("modele", null, values, SQLiteDatabase.CONFLICT_IGNORE); 

    } 

    db.close(); 
    modeleHelper.close(); 
} 
} 

以下是錯誤:

android.database.sqlite.SQLiteException: no such table: modele (code 1): , while compiling: INSERT OR IGNORE INTO modele(name) VALUES (?) 
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469) 
at quentin.android.fastback2.DataAccess.ModeleDAO.addMarque(ModeleDAO.java:31) 
at quentin.android.fastback2.DataAccess.SyncAdapter$3.onResponse(SyncAdapter.java:143) 
at quentin.android.fastback2.DataAccess.SyncAdapter$3.onResponse(SyncAdapter.java:125) 
at quentin.android.fastback2.Model.CustomRequest.deliverResponse(CustomRequest.java:42) 
at quentin.android.fastback2.Model.CustomRequest.deliverResponse(CustomRequest.java:16) 
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

我試過了一些東西,比如更改數據庫版本,卸載/重新安裝應用程序和使用其他設備模擬器(我正在使用Genymotion)
我檢查了數據庫文件,表「marque」是很好的創建,但不是表「模式」。這就像從ModeleDBHelper的OnCreate()方法永遠不會被調用。感謝您的幫助

+0

您不需要創建2個獨立的數據庫幫助器。只有一個就足夠了。 – camelCaseCoder

回答

3

SQLiteOpenHelper版本數據庫文件,而不是表格。如果在同一個數據庫文件中有多個表,請將它們全部放在同一個SQLiteOpenHelper中。

合併助手之後,請卸載您的應用程序,以便刪除舊的數據庫文件並調用創建所有表的onCreate()

0

由於您使用相同名稱"reprise.db"創建數據庫,因此不會爲第二個幫助程序調用on create方法(因爲數據庫文件已存在)。所以從未創建表

public void onCreate(SQLiteDatabase db){ // Never called 
    db.execSQL(SQL_CREATE_ENTRIES); 
} 

如上所示,您應該合併它們以解決此問題。

所以你的oncreate方法會創建兩個表。