使用ORDER ID desc limit 1检索sqlite / Android中最后一行的单个列

时间:2010-11-10 12:40:04

标签: java android sqlite

我正在尝试创建一个方法,允许我从数据库的最后一行检索一个值,然后将其插入到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);

2 个答案:

答案 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,因此无需使用moveToNextmoveToFirst会像moveToNext一样,如果找到一行则返回true,如果没有更多行可用,则返回false

您的陈述如下;执行查询,移动到第一行,如果成功,则返回查询中第一列的字符串(索引从零开始)。如果没有找到一行,则将第一列作为字符串返回,但这可能会失败。在这种情况下,您应该返回默认值或抛出异常。