android sqlite数据库如何读取显示数据(语言-java)

想通过全局变量Login.name作为条件来检索数据表中该行其它列的值,并显示在TextView中。在运行到注释下方语句时会闪退。
在保留使用全局变量作为检索条件的基础上解答,并指出问题所在。
以下是源码:

        TextView username=findViewById(R.id.username);


        DBOpenHelper dbOpenHelper = new DBOpenHelper(Logining.this);
        
        //闪退
        String un = dbOpenHelper.person_serch();
        username.setText(un);

数据库函数:

   public String person_serch(){
       SQLiteDatabase sqLiteDatabase=this.getReadableDatabase();
       String sq = "select * from user where name = ?";
       Cursor cursor = sqLiteDatabase.rawQuery(sq, new String[]{Login.name});

      //public static final String TABLE_USER_name = "name";

       int nameIndex = cursor.getColumnIndex(TABLE_USER_name);
       String  user_name = cursor.getString(nameIndex);

       sqLiteDatabase.close();
       return user_name;
   }

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:
  • 根据您提供的代码和描述,可能是因为 cursor.getString(nameIndex) 返回了空值导致闪退。这可能是由于数据库中没有符合条件的记录,或者记录中该列的值为空。

以下是一些可能的解决方案:

  • 检查数据库中是否存在符合条件的记录,并确保找到的记录中该列的值不为空。
  • 在使用 cursor.getString(nameIndex) 方法之前,可以先使用 cursor.moveToFirst() 方法将指针移到第一条记录。如果未找到符合条件的记录,则返回 false。这样可以确保始终从正确的位置开始读取数据。
  • 如果找不到任何记录,或者记录中该列的值为空,则需要在 UDF 中添加一些错误处理代码,以避免程序崩溃。例如,您可以在无法找到记录时返回一个默认值或给出一个提示信息。

下面是一个可能的修改代码,通过添加错误处理来防止程序崩溃:

public String person_search() {
    SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
    String sq = "select * from user where name = ?";
    Cursor cursor = sqLiteDatabase.rawQuery(sq, new String[]{Login.name});
    if (cursor.moveToFirst()) {
        int nameIndex = cursor.getColumnIndex(TABLE_USER_name);
        String user_name = cursor.getString(nameIndex);
        sqLiteDatabase.close();
        return user_name;
    } else {
        // 找不到记录时返回默认值或给出提示信息
        sqLiteDatabase.close();
        return "未找到符合条件的记录";
    }
}
  • 当您需要通过 SQL 语句从 SQLite 数据库中检索数据,并将检索到的结果显示在 Android 应用程序中时,可以按照以下步骤进行:
  1. 在 DBOpenHelper 类中添加一个方法,用于执行查询操作并返回结果。例如,您的查询语句可能如下所示:

    String query = "SELECT * FROM my_table WHERE column1 = ?";
    Cursor cursor = getReadableDatabase().rawQuery(query, new String[] { value });
    return cursor;
    

    这个方法将返回一个 Cursor 对象,其中包含了所有符合条件的记录。

  2. 在您的 Activity 中,调用该方法并对返回的 Cursor 对象进行处理。在处理过程中,您可以使用 moveToFirst()moveToNext() 方法逐个遍历 Cursor 中的记录,并使用 getColumnIndex()getString() 等方法获取指定列的值。例如,您可以编写如下代码来打印出所有记录的列值:

    Cursor cursor = dbOpenHelper.executeQuery("some_query");
    if (cursor.moveToFirst()) {
        do {
            String column1Value = cursor.getString(cursor.getColumnIndex("column1"));
            String column2Value = cursor.getString(cursor.getColumnIndex("column2"));
            // ...打印其它列的值...
        } while (cursor.moveToNext());
    }
    
  3. 将获取到的数据显示在应用程序的 UI 控件上。例如,您可以创建一个 ListView 控件,并使用 SimpleCursorAdapter 来将 Cursor 中的数据绑定到 ListView 上。代码如下:

    Cursor cursor = dbOpenHelper.executeQuery("some_query");
    String[] fromColumns = {"column1", "column2"};
    int[] toViews = { R.id.text1, R.id.text2 };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item_layout,
                                 cursor, fromColumns, toViews, 0);
    ListView listView = findViewById(R.id.list_view);
    listView.setAdapter(adapter);
    

    在上述代码中,R.layout.list_item_layout 是一个用于呈现单个列表项的布局文件,其中包含两个 TextView 控件(ID 分别为 text1text2),分别用于显示第一列和第二列的值。

希望这些信息能够帮助您更好地理解如何在 Android 应用程序中访问 SQLite 数据库并检索数据。如果还有其他问题,请随时提出。

使用android sqlite查询数据闪退,有可能是报错了导致的,你可以检查下你的错误日志看下是什么类型的错误。其次,检查下Login.name的值是否为空,然后在获取数据前,先判断是否查询到了数据再去取数据:

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  int nameIndex = cursor.getColumnIndex(TABLE_USER_name);
  String  user_name = cursor.getString(nameIndex);
..........
cursor.close()
}


最后关闭掉cursor.close()

闪退后,看看有什么异常打印啊,如果开发工具是idea,在底部的Logcat里面可以看到各种异常打印,根据异常打印,就可以精确定位是什么问题。或者你把异常贴出来,大家就很容易帮你找到问题。

断点确认是否走了 person_serch 这个方法,如果不是的话,应该是前面的语句有问题。最直接的办法就是查询报错日志

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^