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

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 数据库并检索数据。如果还有其他问题,请随时提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • 阳光宅男xxb 2023-03-21 08:15
    关注

    使用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()

    评论
  • 成都渔民 2023-03-21 08:33
    关注

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

    评论
  • IT技术分享社区 数据库领域优质创作者 2023-03-21 08:57
    关注

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

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-22 19:15
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 ECharts 增加Zoom,整行包括右边的Text一起滑动
  • ¥15 关于网上一个easyx制作的见缝插针小游戏(c++)
  • ¥15 开地址法双散列函数处理碰撞
  • ¥15 想问一下这个是什么情况 虚拟机Linux打不开了
  • ¥15 联通光猫掉注册了怎么重新注册上去
  • ¥15 关于unity开发steamvr程序遇到的问题
  • ¥60 求tc downloader的下载方式
  • ¥15 华为 快捷方式 手电筒 接口
  • ¥15 Qt6.5支不支持Android13开发啊
  • ¥20 网络只能跑一半,应该如何设置