想通过全局变量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安生共同编写:
cursor.getString(nameIndex)
返回了空值导致闪退。这可能是由于数据库中没有符合条件的记录,或者记录中该列的值为空。以下是一些可能的解决方案:
cursor.getString(nameIndex)
方法之前,可以先使用 cursor.moveToFirst()
方法将指针移到第一条记录。如果未找到符合条件的记录,则返回 false。这样可以确保始终从正确的位置开始读取数据。下面是一个可能的修改代码,通过添加错误处理来防止程序崩溃:
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 "未找到符合条件的记录";
}
}
在 DBOpenHelper 类中添加一个方法,用于执行查询操作并返回结果。例如,您的查询语句可能如下所示:
String query = "SELECT * FROM my_table WHERE column1 = ?";
Cursor cursor = getReadableDatabase().rawQuery(query, new String[] { value });
return cursor;
这个方法将返回一个 Cursor
对象,其中包含了所有符合条件的记录。
在您的 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());
}
将获取到的数据显示在应用程序的 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 分别为 text1
和 text2
),分别用于显示第一列和第二列的值。
希望这些信息能够帮助您更好地理解如何在 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 这个方法,如果不是的话,应该是前面的语句有问题。最直接的办法就是查询报错日志
不知道你这个问题是否已经解决, 如果还没有解决的话: