j11488 2023-03-20 23:54 采纳率: 100%
浏览 64
已结题

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;
   }

  • 写回答

5条回答 默认 最新

  • OKX安生 2023-03-21 03:12
    关注
    该回答引用于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 数据库并检索数据。如果还有其他问题,请随时提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 修改了问题 3月21日
  • 修改了问题 3月21日
  • 展开全部

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测