我在Mac OS 10.7.5上运行Android Studio。我正在编写的应用程序查询是一个数据库,我一直遇到我的查询不工作的问题,并使用相同的确切查询生成0结果。我在Firefox的SQLite管理器中测试了Query,它产生了我正在寻找的结果。
这个问题每次都不会发生。我将离开工作并回家工作,但不会,反之亦然。为了尝试和调试我已经硬编码了一个有效的查询,但仍然没有结果。但是,当代码正在运行硬编码查询和我的其他查询工作方法没有问题。
由于此错误,我尝试更改构建设置以使用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;
}
}
答案 0 :(得分:0)
我假设你在某个地方的UI中显示你的结果,所以如果你使用Listview,ExpandedListView等,android视图要求你的表中有一个列_id并在你的查询中检索,以便view可以通过_id列与数据库游标中的数据适配器数据保持同步。
我从未使用过
cursor.close();
这就带来了如何管理光标的问题,这实际上取决于您为应用程序定位的版本。对于Honeycomb以及后来我会看'游标加载器',在使用'startManagingCursor'之前,我相信它建议用户游标加载器,这将消除你关闭光标的需要。由于游标是异步类型任务,因此您可以在返回任何结果之前关闭游标。
对于光标加载器,我建议How to use loaders in Android
您还可以在github.com或code.google.com等搜索代码
如果您因任何原因需要_id,可以在投影中用这个来伪造您的查询:
id as _id,
希望这有帮助。