1

所以我正在尝试从我的一个数据库表中获取数据,您能否帮我检查一下,看看您是否能发现错误?

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这绝对是正确的。我试图关闭 db 连接,它工作正常,所以 db 工作正常并且存在。

所有表列名称都是正确的,因为它们在 onCreate 中用于创建数据库并且工作正常。我也尝试过使用

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

因此,当我进行查询时,应用程序停止并且我Source code not found在 Eclipse 中收到一条消息。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);

这段代码没有崩溃,一切看起来都很好,但是在查询过程中找不到表。

知道有什么问题吗?

4

2 回答 2

3

您所做的是一个有效的 SQL 语句列表。这里真正的问题是方法 execSQL() 只允许您执行单个 sql 语句(请参阅此处的文档)。

如果你想自动执行多个语句,我会编写一个方法,首先拆分这些语句(通过每个语句的结束分号),然后在循环中执行每个语句,检查每次迭代中的错误,以便当一些 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();
}
于 2013-07-20T16:06:08.513 回答
1

我不是 SQL 专家,但我认为您在创建表时尝试做的太多了。我建议创建表格并在 2 个不同的步骤中添加任何初始数据。

我的数据库中没有任何初始数据,但这是我用来创建表的:

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

使用 aContentValues将您需要的数据添加到数据库中。

contentValues = new ContentValues();
contentValues.putXXX();
// keep adding data
// the insert method will add the data for you.
SQLiteDatabase.insert(TABLE_NAME, null, contentValues);
于 2013-02-26T21:14:02.060 回答