我正在尝试创建一个方法,允许我从数据库的最后一行检索一个值,然后将其插入到EditText字段中。 (这是一个用户不会经常更改的值,因此如果他们设置它时会有所帮助,当它们返回时它会保持设置状态。)
我的方法,基于我获得特定列总数的类似方法,是这样的:
public String getBase() {
Cursor mCursor = mDb.rawQuery(
"SELECT base FROM table constants ORDER ID desc limit 1", null);
if (mCursor.moveToFirst()) {
return mCursor.getString(0);
}
return mCursor.getString(0);
就像我说的那样,我基于类似的方法,我在网上搜索后找到了这个方法。我理解其中的大部分内容,但我不知道返回语句中的0是什么意思(或者moveToFirst方法)。
无论如何,在我的OnClickListener(用户按此按钮将此值保存到db)中,我有以下内容(editBase是我要填充的EditText字段):
editBase.setText(cDbHelper.getBase());
如果我在没有此语句的情况下运行程序,它可以正常工作并将值保存到db。一旦我尝试用它来运行它,我就会接近一个力量。有什么建议吗?
感谢。
编辑:感谢您的回复。在朋友的一些指导下,我最终使用了“ORDER BY ... desc limit 1”。这是最后一种方法:
public double getBase() {
final double DEFAULT_BASE = 0;
Cursor mCursor = mDb.rawQuery(
"SELECT base FROM constants ORDER BY _id desc limit 1", null);
if (mCursor.getCount() == 0)
return DEFAULT_BASE;
else
mCursor.moveToFirst();
return mCursor.getDouble(0);
答案 0 :(得分:0)
1)查询数据库可能会尝试这个:
https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
SQLiteDatabase有query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
方法。
至少使用这个,您不需要手动构建SQL。
2)检查doc for Cursor: http://developer.android.com/reference/android/database/Cursor.html#getString(int)
0是columnIndex。
答案 1 :(得分:0)
您可能尝试在单独的线程上运行作业时更新View,这几乎总是会触发强制关闭。
在本文Painless Threading中,您将学习如何将长期运行的工作分解为另一个线程(以及如何“回归”它)。基本上,您可以告诉GUI线程(或事件队列或ui线程)您需要Runnable
来运行控件和视图。
private void clicked() {
// called from a click of a button for instance
new Thread(new Runnable() {
public void run() {
// the long running job should be executed on a different
// thread as to not stall the ui thread
runLongWork();
}
}
}
private void runLongWork() {
// this is method running on separate thread
// so we should run a runnable on the ui thread instead to update our view's.
this.runOnUiThread(new Runnable() {
public void run() {
// Now we are back in the ui thread
editBase.setText(cDbHelper.getBase());
}
}
}
至于其他问题Arhimed已经部分回答了问题。当您对Sqlite数据库执行查询时,您将获得类Cursor的实例,该实例是查询获取的结果或行的列表。使用moveToFirst
方法将光标定位在第一行结果中。然后,您可以使用getXYZ()
方法(例如getString())从查询中的列中获取值,并传递所需列的索引。在这种情况下,0表示base
,即SQL查询中的第一列。
我有多行你可以使用moveToNext
方法来获取下一行,并且因为它返回一个bool,说明它实际上“找到”了下一行,你可以在一段时间内使用它循环以获取所有行。
while (cursor.moveToNext()) {
// next row of data, use getString, getInt or others
}
您的查询altough将始终只返回一个值,因为您将结果限制为1
,因此无需使用moveToNext
。 moveToFirst
会像moveToNext
一样,如果找到一行则返回true
,如果没有更多行可用,则返回false
。
您的陈述如下;执行查询,移动到第一行,如果成功,则返回查询中第一列的字符串(索引从零开始)。如果没有找到一行,则将第一列作为字符串返回,但这可能会失败。在这种情况下,您应该返回默认值或抛出异常。