2012-11-25 65 views
9

Tôi đang sử dụng mã sau để tạo nhiều bảng trong cơ sở dữ liệu. Nhưng, tôi không hiểu tại sao vấn đề này lại xảy ra.các sự cố khi tạo nhiều bảng trong 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); 
    } 

đây là chức năng chèn

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 
    } 

và bây giờ vào các hoạt động chính của tôi, tôi đã sử dụng mã này để chèn vào bảng

DatabaseHandler db = new DatabaseHandler(this); 

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

này nhưng nó mang lại cho tôi những lỗi đó không đã tìm thấy bảng "SMSFILTER".

kết quả Log là ở đây

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

Toàn bộ LogCat nói gì? – Ahmad

+0

@Ahmad xem câu hỏi cập nhật –

+2

Bạn đã thử gỡ cài đặt ứng dụng và sau đó cài đặt lại ứng dụng chưa? – Luksprog

Trả lời

1

onUpgrade được gọi khi databse version number được thay đổi. Khi cập nhật bảng của bạn, bạn cần phải tăng cơ sở dữ liệu version number, chỉ định truy vấn tạo bảng mới trong phương thức onCreate và đặt phương thức ALTER TABLE đến onUpgrade để cập nhật phiên bản trước của bảng. Khi Android phát hiện phiên bản cơ sở dữ liệu không phù hợp, nó sẽ gọi onUpgrade phương pháp tự động

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

Cập nhật này để

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

bảng lịch trình của bạn tạo mã không được làm việc như trong dòng cuối cùng không có không gian b/w số nguyên và tên cột đang tạo sự cố.

0

Lưu ý rằng onCreate chỉ được gọi là lần đầu tiên tệp cơ sở dữ liệu của cơ sở dữ liệu được tạo. Dường như phương thức onCreate không được gọi vì cơ sở dữ liệu đã tồn tại ở đâu đó trong SDCard. Do đó, bảng SMSFilter không được tạo. Bạn cần sao chép mã trong onCreate sang phương thức onUpgrade (sau lệnh thả bảng). Ngoài ra, để kích hoạt onUpgrade, bạn phải tăng phiên bản cơ sở dữ liệu.

Các vấn đề liên quan