【问题标题】:Unable to get some random data form SQLite无法从 SQLite 中获取一些随机数据
【发布时间】:2017-04-26 15:37:42
【问题描述】:

我正在制作一个使用 sqlite 数据库生成随机值的应用程序,但它没有给出值。即使没有显示添加的记录,它也始终显示空白活动。这是我的代码。我想在 ListView 中显示一些随机数据。

我有另一个类用于插入数据,并且有一个显示数据的按钮和一个调用生成一些随机数据的 Activity 的函数,但该 Activity 无法正常工作

导入android.content.Context;

import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;


public class ViewPeople extends AppCompatActivity {


    private static final String SELECT_SQL = "SELECT * FROM persons";
    private Cursor mCurRandom;
    private SQLiteDatabase db;

    private Cursor c;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_people);
        openDatabase();
        c = db.rawQuery(SELECT_SQL, null);
        c.moveToFirst();
        showRecords();
    }

    protected void openDatabase() {
        db = openOrCreateDatabase("PersonDB", Context.MODE_PRIVATE, null);
    }

    protected void showRecords() {

        try {
            String sql = "SELECT * FROM persons ORDER BY RANDOM() LIMIT 1";

            mCurRandom = db.rawQuery(sql, null);
            if (mCurRandom != null) {
                mCurRandom.moveToNext();
                return;
            }
            {

                showRecords();

            }


        } catch (SQLException mSQLException) {

            throw mSQLException;
        }
        return;
    }

}

我的布局是

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".ViewPeople">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Name"
        android:id="@+id/textViewName" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" >
    </ListView>
    </LinearLayout>

【问题讨论】:

  • “但是那个 Activity 不能正常工作” - 你能告诉我们这意味着什么吗?它在哪些方面无法正常工作?
  • 它甚至没有显示所有添加到数据库中的记录
  • 您需要通过适配器填充 ListView。也许是 SimpleCursorAdapter 或自定义适配器。还要注意答案逻辑错误和 showRecords 调用自身。看看这个Android: Using SimpleCursorAdapter to get Data from Database to ListView。但是,您只会获得 1 条记录(除非您更改限制),因此不需要具有 LIMIT 1 的 ListView。

标签: android sqlite listview android-sqlite random-data


【解决方案1】:

看起来你有一个逻辑错误:

mCurRandom = db.rawQuery(sql, null);
if (mCurRandom != null) {
    mCurRandom.moveToNext();
    return;
}
{

    showRecords();

}

首先,db.rawQuery 永远不会返回null;它将返回 Cursor 对象或抛出异常。所以分支总是被占用。发生这种情况时,不会调用 showRecords()

这可能是一件好事,因为否则你将有一个无限递归,showRecords() 一遍又一遍地调用自己。

这似乎与您的意思相反。你可能想要的是:

if (mCurRandom.moveToFirst()) {
    // Do something with the random record
}

【讨论】:

  • @GauravAwasthi - 从您的代码中看不出您要完成什么。活动是否应该在TextView 中显示单个随机记录?是否应该在ListView中显示整个数据库内容?
  • 简单的一条我想显示的随机记录
  • @GauravAwasthi -- 只需将// Do something.. 替换为从Cursor 检索列值所需的代码,然后调用该字段的setText() 方法。 (您可能只想检索 Cursor 中感兴趣的列,而不是检索带有 Select * 的所有列。)
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2018-05-28
  • 2012-01-06
相关资源
最近更新 更多