2012-11-25 13 views
9

Korzystam z następującego kodu do tworzenia wielu tabel w bazie danych. Ale nie rozumiem, dlaczego ten problem się dzieje.Problemy z tworzeniem wielu tabel w sqlite

private static final String TABLE_SMSFilter = "SMSFilter"; 


public void onCreate(SQLiteDatabase db) 
    { 
     Log.d("Test", "Control is in Oncreate()"); 
     String CREATE_SMSSSCHEDULE_TABLE = "CREATE TABLE " + TABLE_SMSSchedule 
       + "(" + KEY_ID + " INTEGER PRIMARY KEY autoincrement," 
       + KEY_NUMBER + " TEXT)"; 

     String CREATE_PROFILE_SCHEDULE_TABLE = "CREATE TABLE " 
       + TABLE_ProfileSchedule + "(" + ProfileSchedule_ID 
       + " INTEGER PRIMARY KEY autoincrement," 
       + ProfileSchedule_NUMBER + " TEXT, " 
       + ProfileSchedule_ProfileMode + " TEXT," 
       + ProfileSchedule_CalendarID + "INTEGER)"; 

     String CREATE_SMS_FILTER_TABLE = "CREATE TABLE " + TABLE_SMSFilter 
       + "(" + SMSFilter_ID + " INTEGER PRIMARY KEY autoincrement," 
       + SMSFilter_NUMBER + " TEXT)"; 

     db.execSQL(CREATE_SMSSSCHEDULE_TABLE); 
     db.execSQL(CREATE_PROFILE_SCHEDULE_TABLE); 
     db.execSQL(CREATE_SMS_FILTER_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_SMSSchedule); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_ProfileSchedule); 

     db.execSQL("DROP TABLE IF EXISTS " + TABLE_SMSFilter); 

     // Create tables again 
     onCreate(db); 
    } 

tutaj jest funkcja insert

public void addSMSFilter(SMSFilter filterVariable) 
    { 

     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(SMSFilter_NUMBER, filterVariable.getPhoneNumber()); // Contact 
                     // Name 
     // values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone 

     Log.d("test", "inserting" + filterVariable.getPhoneNumber()); 
     // Inserting Row 
     db.insert(TABLE_SMSFilter, null, values); 

     db.close(); // Closing database connection 
    } 

i teraz w moim głównej działalności, kiedyś ten kod wstawić do tej tabeli

DatabaseHandler db = new DatabaseHandler(this); 

     SMSFilter sms = new SMSFilter("1234556"); 
     db.addSMSFilter(sms); 

ale daje mi błąd, że nie Znaleziono tabelę "SMSFILTER".

wynik Log jest tutaj

11-25 22:52:22.643: I/Database(12209): sqlite returned: error code = 1, msg = no such table: SMSFilter 
11-25 22:52:22.643: E/Database(12209): Error inserting PhoneNo=1234556 
11-25 22:52:22.643: E/Database(12209): android.database.sqlite.SQLiteException: no such table: SMSFilter: , while compiling: INSERT INTO SMSFilter(PhoneNo) VALUES(?); 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1212) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1610) 
11-25 22:52:22.643: E/Database(12209): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1484) 
11-25 22:52:22.643: E/Database(12209): at com.scheduler.database.DatabaseHandler.addSMSFilter(DatabaseHandler.java:327) 
11-25 22:52:22.643: E/Database(12209): at com.schedule.test.TestActivity.onCreate(TestActivity.java:31) 
11-25 22:52:22.643: E/Database(12209): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
11-25 22:52:22.643: E/Database(12209): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
11-25 22:52:22.643: E/Database(12209): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
11-25 22:52:22.643: E/Database(12209): at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
11-25 22:52:22.643: E/Database(12209): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
11-25 22:52:22.643: E/Database(12209): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-25 22:52:22.643: E/Database(12209): at android.os.Looper.loop(Looper.java:144) 
11-25 22:52:22.643: E/Database(12209): at android.app.ActivityThread.main(ActivityThread.java:4937) 
11-25 22:52:22.643: E/Database(12209): at java.lang.reflect.Method.invokeNative(Native Method) 
11-25 22:52:22.643: E/Database(12209): at java.lang.reflect.Method.invoke(Method.java:521) 
11-25 22:52:22.643: E/Database(12209): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
11-25 22:52:22.643: E/Database(12209): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
11-25 22:52:22.643: E/Database(12209): at dalvik.system.NativeStart.main(Native Method) 
+0

Co mówi cały LogCat? – Ahmad

+0

@Ahmad zobacz zaktualizowane pytanie –

+2

Czy próbowałeś odinstalować aplikację, a następnie ponownie ją zainstalować? – Luksprog

Odpowiedz

1

onUpgrade nazywa kiedy databse version number ulega zmianie. Podczas aktualizacji tabeli należy zwiększyć bazę danych version number, określić nowe zapytanie do utworzenia tabeli w metodzie onCreate i zastosować metodę ALTER TABLE do onUpgrade, aby zaktualizować poprzednią wersję tabeli. Kiedy Android wykrywa wersji bazy danych niedopasowanie będzie zadzwonić onUpgrade metoda automatycznie

0
String CREATE_PROFILE_SCHEDULE_TABLE = "CREATE TABLE " 
      + TABLE_ProfileSchedule + "(" + ProfileSchedule_ID 
      + " INTEGER PRIMARY KEY autoincrement," 
      + ProfileSchedule_NUMBER + " TEXT, " 
      + ProfileSchedule_ProfileMode + " TEXT," 
      + ProfileSchedule_CalendarID + "INTEGER)"; 

Aktualizacja to

String CREATE_PROFILE_SCHEDULE_TABLE = "CREATE TABLE " 
      + TABLE_ProfileSchedule + "(" + ProfileSchedule_ID 
      + " INTEGER PRIMARY KEY autoincrement," 
      + ProfileSchedule_NUMBER + " TEXT, " 
      + ProfileSchedule_ProfileMode + " TEXT," 
      + ProfileSchedule_CalendarID + " INTEGER)"; 

tabeli harmonogramu tworzenia kodu nie działa tak jak w ostatnim wierszu nie ma miejsca b/w całkowitej i nazwa kolumny tworzy problem.

0

Należy pamiętać, że onCreate jest wywoływany tylko przy pierwszym tworzeniu pliku fizycznego bazy danych. Wydaje się, że nie jest wywoływana metoda onCreate, ponieważ baza danych już istnieje w karcie SD. Stąd tabela SMSFilter nie zostanie utworzona. Należy skopiować kod w ciągu onCreate do metody onUpgrade (po poleceniu drop table). Ponadto, aby uruchomić onUpgrade, musisz zwiększyć wersję bazy danych.

Powiązane problemy