2013-02-26 130 views
1

因此,我試圖從我的數據庫表中取數據,請你檢查一下,看看你是否可以發現錯誤?Android SQLite創建的數據庫,但無法找到表

SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH, null, 
      SQLiteDatabase.OPEN_READONLY); 

    Cursor cursor = db.query(TABLE_CLASSES, new String[] { TABLE_C_DAY, 
      TABLE_C_NAME, TABLE_C_DAY, TABLE_C_LOCATION, TABLE_C_TIMEHR, 
      TABLE_C_TIMEMIN, TABLE_C_DURATION, TABLE_C_ONETIMEEVENT, 
      TABLE_C_CTYPE, TABLE_C_OCCURINGWEEK}, TABLE_C_DAY + "=?", 
      new String[] { String.valueOf(day) }, null, null, null, null); 

好吧DB_PATH是絕對正確的。我試圖關閉數據庫連接,它工作正常,所以數據庫工作正常,並存在。

所有的表列名都是正確的,因爲這些在onCreate中用於創建數據庫,並且工作正常。我使用

db.rawQuery("SELECT * FROM " + TABLE_CLASSES + " WHERE day = ?", new String[] { String.valueOf(day) }); 

所以,當我使查詢應用程序停止和我在Eclipse中Source code not found消息也試過。 LogCat說表'類'不存在。

我嘗試手動創建代碼,它的工作。這是來自onCreate(SQLiteDatabase db)的代碼;

String CREATE_DB_WITH_INIT_VALUES = 
      "CREATE TABLE %1$s (%4$s TEXT);" + 
      "INSERT INTO %1$s VALUES('Lecture');" + 
      "INSERT INTO %1$s VALUES('Lab');" + 
      "INSERT INTO %1$s VALUES('Tutorial');" + 
      "INSERT INTO %1$s VALUES('Meeting');" + 
      "INSERT INTO %1$s VALUES('Examples Class');" + 
      "CREATE TABLE %2$s (%5$s smallint, %6$s varchar(40), %7$s varchar(10), %8$s smallint, %9$s smallint, %10$s smallint, %11$s boolean, %12$s smallint, %13$s smallint);" + 
      "INSERT INTO %2$s VALUES(1,'COMP12112 Computation',1.1,9,0,60,'False','Lecture',3);" + 
      "INSERT INTO %2$s VALUES(1,'COMP16212 Java OOP 2',1.1,11,0,45,'False','Lecture',3);" + 
      "INSERT INTO %2$s VALUES(1,'COMP18111 Distributed Systems','Unix',13,15,60,'False','Lab',3);" + 
      "INSERT INTO %2$s VALUES(2,'Tutorial','LF13',15,0,60,'False','Tutorial',3);" + 
      "INSERT INTO %2$s VALUES(2,'COMP14111 AI','LF31',10,30,60,'False','Lab',3);" + 
      "CREATE TABLE %3$s (%14$s smallint, %15$s smallint, %16$s TEXT, %17$s date);"; 

    CREATE_DB_WITH_INIT_VALUES = String.format(CREATE_DB_WITH_INIT_VALUES, TABLE_CLASS_TYPES, 
      TABLE_CLASSES, TABLE_DEADLINES, TABLE_CT_TYPE, 
      TABLE_C_DAY, TABLE_C_NAME, TABLE_C_LOCATION, TABLE_C_TIMEHR, TABLE_C_TIMEMIN, TABLE_C_DURATION, 
      TABLE_C_ONETIMEEVENT, TABLE_C_CTYPE, TABLE_C_OCCURINGWEEK, 
      TABLE_D_TIMEHR, TABLE_D_TIMEMIN, TABLE_D_DTEXT, TABLE_D_DDATE 
      ); 

    db.execSQL(CREATE_DB_WITH_INIT_VALUES); 

此代碼不會崩潰,並且一切似乎都很好,但在查詢期間無法找到表。

任何想法是什麼錯?

+0

當你說你試圖手動創建表,你的意思是從一個cmd提示? – 2013-02-26 20:49:18

+0

通過SQLite數據庫瀏覽器,我複製CREATE_DB_WITH_INIT_VALUES格式化後,它工作正常。 – 2013-02-26 20:52:39

回答

1

我不是SQL專家,但我認爲你在創建表時嘗試做得太多。我建議創建表格並在兩個不同的步驟中添加任何初始數據。

我沒有在我的數據庫中的所有原始數據,但是這是我使用創建表的內容:創建表後

createTable = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY," + 
COLUMN_ONE + " TEXT," + COLUMN_TWO + " INTEGER," + COLUMN_THREE + " TEXT," + 
COLUMN_FOUR + " TEXT," + COLUMN_FIVE + " TEXT)"; 

db.execSQL(createTable); 

現在在你的情況,那麼你可以將初始數據你要。

db.execSQL(createTable); 

使用ContentValues將您需要的數據添加到數據庫。

contentValues = new ContentValues(); 
contentValues.putXXX(); 
// keep adding data 
// the insert method will add the data for you. 
SQLiteDatabase.insert(TABLE_NAME, null, contentValues); 
+0

謝謝!是的,這是問題,當我做了一個1的SQL語句,它工作正常! – 2013-02-26 21:51:13

+0

好我很高興它幫助你。 – 2013-02-27 01:45:57

2

你所做的是一個有效的SQL語句列表。這裏真正的問題是execSQL()方法只允許執行單個sql語句(請參閱文檔here)。

如果你想自動執行多個語句,我會編寫一個方法,首先將這些語句拆分(以每個語句的結尾分號),然後在循環中執行每個語句,檢查每次迭代中的錯誤,當某個sql語句失敗時,可以拋出一個SQLException來指示失敗的sql語句。就像這樣:

public static void execSQLScript(SQLiteDatabase db, String script) throws SQLException { 
    String[] statements = script.split(";"); 
    db.beginTransaction(); 
    for(String statement : statements) { 
     try { 
     db.execSQL(statement); // Seems like this method already throws a decent exception 
     } 
     catch(SQLException e) { 
      db.endTransaction(); // Rolling back the changes done 
      throw e; 
     } 
    } 
    db.setTransactionSuccessful(); // Not rolling but commiting changes, since everything went fine. 
    db.endTransaction(); 
}