2013-02-26 352 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(); 
}