【问题标题】:Database Querying Issue with Android StudioAndroid Studio 的数据库查询问题
【发布时间】:2013-07-30 03:10:41
【问题描述】:

我在 Mac OS 10.7.5 上运行 Android Studio。我正在编写查询的应用程序是一个数据库,我一直遇到我的查询不起作用的问题,并且使用相同的查询产生 0 个结果。我已经在 Firefox 的 SQLite 管理器中测试了查询,它产生了我正在寻找的结果。

这个问题也不是每次都会发生。我会带着它工作回家,但它不会,反之亦然。为了尝试调试,我硬编码了一个有效的查询,但仍然没有结果。但是,当代码工作时,硬编码查询和我的其他查询方法没有问题。

我尝试在 Preferences / Compiler / Use External Build 下更改构建设置以使用外部构建,因为这个错误:

10:56:27 PM Deprecated make implementation
        Old implementation of "Make" feature is enabled for this project.
        It has been deprecated and will be removed soon.
        Please enable newer 'external build' feature in Settings | Compiler.

在事件日志中,这使它工作了一段时间,然后返回错误。我也尝试过更新 Android Studio,它也修复了一次,但问题又回来了。任何帮助或建议将不胜感激。如果您需要更多信息,请告诉我。

public class DBAccess extends SQLiteOpenHelper {

private SQLiteDatabase database;

public static String TABLE_PATH = "";

public static final String COLUMN_ROWID = "rowid";
public static final String COLUMN_LASTNAME = "lastname";
public static final String COLUMN_FIRSTNAME = "firstname";

private static final String DATABASE_NAME = "employeedb.sqlite";
private static final String TABLE_EMPLOYEE = "employee";
private static final int DATABASE_VERSION = 1;

// Database creation SQL statement
private static final String DATABASE_CREATE_SQL = "create table "
        + TABLE_EMPLOYEE  + "("
        + COLUMN_ROWID    + " text, "
        + COLUMN_LASTNAME    + " text, "
        + COLUMN_FIRSTNAME    + " text"
        + ");";

public DBAccess(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    TABLE_PATH = context.getDatabasePath(Constants.databaseName).toString();

}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.execSQL(DATABASE_CREATE_SQL);
    }catch (SQLException e) {}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMPLOYEE);
    onCreate(db);
}

public void open() throws SQLException {
    database = getWritableDatabase();
}

public void close() {
    database.close();
}

public ArrayList<Person> searchSQLWithPrefix(String prefix, String[] params) {
    ArrayList<Person> results = new ArrayList<Person>();


    Cursor cursor = database.rawQuery("SELECT lastname, firstname FROM employee " +
            "WHERE UPPER(lastname) like UPPER('Smith') OR UPPER(firstname) like " +
            "UPPER('Smith') ORDER BY firstname, lastname LIMIT 1000", null);

    //Cursor cursor = database.rawQuery(prefix, params);

    if (cursor != null) {
        return setPeople(cursor);
    }
    cursor.close();
    return results;
}

public ArrayList<Person> setPeople(Cursor cursor) {
    ArrayList<Person> results = new ArrayList<Person>();
    Log.e("Test", "Cursor Count: " + cursor.getCount());

    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            Person p = new Person( cursor, cursor.getPosition() );
            results.add( p );
    }
    return results;
}
}

【问题讨论】:

    标签: android sqlite android-studio


    【解决方案1】:

    我假设您在 UI 的某处显示您的结果,因此如果您使用 Listview、ExpandedListView 等。android 视图要求您的表中有一个列 _id 并在您的查询中检索,以便视图可以通过 _id 列与数据库游标中数据适配器的数据保持同步。

    我从来没用过

    cursor.close();
    

    这就带来了如何管理光标的问题,这实际上取决于您的应用程序的目标版本。对于 Honeycomb 及之后的版本,我会查看“光标加载器”,在此之前使用“startManagingCursor”,但我相信它会推荐给用户光标加载器,这将消除您关闭光标的需要。由于游标是异步类型的任务,您可以在游标返回任何结果之前关闭游标。

    对于光标加载器,我建议How to use loaders in Android

    您也可以在github.com或code.google.com等搜索代码

    如果你出于任何原因需要 _id,你可以在你的投影中伪造你的查询:

    id as _id, 
    

    希望这会有所帮助。

    【讨论】:

    • 我在 UI 中显示我的结果,该 UI 使用的是 rowid 列而不是 _id 列。问题是目前我无法让光标返回任何结果。我什至试过这个语句Cursor cursor = database.rawQuery("SELECT * FROM employee;", null);,我仍然得到游标计数为 0。
    • 我想通了。问题是我的数据库已经存在,我正在创建一个带有空表的新数据库,因此结果为 0。感谢您的帮助,我会考虑使用光标加载器作为更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多