2012-11-25 17 views
9

Veritabanında birden çok tablo oluşturmak için aşağıdaki kodu kullanıyorum. Ancak, bu sorunun neden olduğunu anlamıyorum. Burada sorunları

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

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 
    } 

ve şimdi benim ana aktivitede, bu masada

DatabaseHandler db = new DatabaseHandler(this); 

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

eklemek için bu kodu kullanılan insert işlevidir ama bana hayır bu hata veriyor "SMSFILTER" tablosu bulundu.

Günlüğü sonucu databse version number değiştirildiğinde

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

Tüm LogCat ne diyor? – Ahmad

+0

@Ahmad bkz. Güncelleştirilmiş soru –

+2

Uygulamayı kaldırmayı ve yeniden yüklemeyi denediniz mi? – Luksprog

cevap

1

onUpgrade denir burada. Tablonuzu güncelleştirirken, version number veritabanını artırmanız, onCreate yönteminde yeni tablo oluşturma sorgusu belirtmeniz ve tablonun önceki sürümünü güncellemek için ALTER TABLE yöntemini onUpgrade yöntemine ayarlamanız gerekir. Android veritabanı sürümü uyuşmazlığı algıladığında,

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

Programınızda masaya oluşturmak kod için

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)"; 

Güncelleme otomatik onUpgrade yöntem bu arayacak/tamsayı w ve b son satırında hiçbir boşluk çalışmıyor sütun adı sorun yaratıyor.

0

Not onCreate yalnızca veritabanı fiziksel dosyasının oluşturulduğu ilk kez çağrılır. Veritabanının zaten SDCard'ın bir yerinde bulunduğu için onCreate yönteminin çağrılmadığı anlaşılıyor. Bu nedenle tablo SMSFilter oluşturulmadı. OnCreate içindeki kodu onUpgrade yöntemine (drop table komutlarından sonra) kopyalamanız gerekir. Ayrıca, onUpgrade'u tetiklemek için veritabanı sürümünü artırmanız gerekir.