如何从android中的sqlite中检索数据

Posted

技术标签:

【中文标题】如何从android中的sqlite中检索数据【英文标题】:how to retrieve data from sqlite in android 【发布时间】:2019-02-20 01:02:51 【问题描述】:

我正在开发一个 sqlite 数据库,我确信我已经正确地插入了 sqlite。 现在我正在使用游标从 sqlite 获取数据,但是当我将数据设置为 Texview 时,我的应用程序崩溃了。这是我的桌子:

这是我的光标代码:

SQLiteDatabase db = this.getReadableDatabase();
    String query = "SELECT * FROM " + PRODUCT_TABLE + " where id = 23";
    Cursor cursor = db.rawQuery(query,null);
    return cursor;

这是我从数据库中获取数据的活动代码

dbHelper = new DBHelper(context);
    Cursor c = dbHelper.getCheckOutProduct();
    if (c != null)
        while (c.moveToNext()) 
            int Id = c.getInt(0);
            int paymentTypeID = c.getInt(1);
            int customerID = c.getInt(2);
         
        

我在哪里犯错了?先感谢您 here is my exception

【问题讨论】:

请将错误和logcat添加到问题中。 logcat 中的异常在 logcat 中立即消失。我没有显示异常 从 Logcat 窗口中选择死进程并复制错误信息 请看是否正确:String query = "SELECT * FROM " + ORDER_TABLE + " WHERE ID = "+ autoOrderId;光标 cursor = db.rawQuery(query,null); 【参考方案1】:

你的问题是你选择了所有的列

String query = "SELECT * FROM " + ORDER_TABLE + " ORDER BY ID DESC LIMIT 1 ";

但是您没有获得 AddressId 列的列索引

改变

dbHelper = new DBHelper(context);
Cursor c = dbHelper.getCheckOutRequest();
if (c != null)
    while (c.moveToNext()) 
        int Id = c.getInt(0);
        int paymentTypeID = c.getInt(1);
        int customerID = c.getInt(2);
     
    

dbHelper = new DBHelper(context);
Cursor c = dbHelper.getCheckOutRequest();
if (c != null)
    while (c.moveToNext()) 
        int Id = c.getInt(0);
        int AddressID = c.getInt(1);
        int paymentTypeID = c.getInt(2);
        int customerID = c.getInt(3);
     
    

【讨论】:

我现在已经完成了。我有另一个例外,请参阅我更新的问题 你需要使用 movetoFirst() @ansar abbas【参考方案2】:

可能是因为您将 String 转换为 int,试试这个 -

int Id = 0;
int paymentTypeID = 0;
int customerID = 0;

dbHelper = new DBHelper(context);
    Cursor c = dbHelper.getCheckOutRequest();
    if (c != null)
        while (c.moveToNext()) 
             Id = c.getInt(0);
             paymentTypeID = c.getInt(1);
             customerID = c.getInt(2);
     
        

然后在Textview中,

textView.setText(String.valueOf(Id));

【讨论】:

列的数据类型为整数类型 @ansarabbas 更新了答案,同时显示 logcat 请看是否正确:String query = "SELECT * FROM " + ORDER_TABLE + " WHERE ID = "+ autoOrderId;光标 cursor = db.rawQuery(query,null); 我现在已经完成了。我有另一个例外,看到你更新的问题【参考方案3】:

让我们改变你的光标方式并以其他代码方式 你有这个表,你想设置并从中获取数据嗯,让我们尝试更努力的代码 但是接下来用起来会很容易

||========================================||
|| ORDER_TABLE                            ||
||========================================||
||  ID                                    ||
||  AddressID                             ||
||  PaymentTypeID                         ||
||  CustomerID                            ||
||========================================||

将此函数放入 DBHelper 类中

public ArrayList<Map<String, String>> getorder()

    ArrayList<Map<String, String>> array_list = new ArrayList<>();

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery("select * from " + ORDER_TABLE + " ORDER BY ID DESC LIMIT 1 " , null);
    res.moveToFirst();

    while(res.isAfterLast() == false)
        Map<String, String> datanum = new HashMap<String, String>();
        datanum.put("ID", res.getString(res.getColumnIndex("ID")));
        datanum.put("AddressID", res.getString(res.getColumnIndex("AddressID")));
        datanum.put("PaymentTypeID", res.getString(res.getColumnIndex("PaymentTypeID")));
        datanum.put("CustomerID", res.getString(res.getColumnIndex("CustomerID")));
        array_list.add(datanum);
        res.moveToNext();
    
    return array_list;

以及从 DBHelper 获取数据的代码

    DB = new DBHelper(this);
    ArrayList<Map<String, String>> order = DB.getorder();


  String ID;
  String AddressID;
  String PaymentTypeID;
  String CustomerID;

    try 
    if(order.size() = 0)
        //database is empty
     else 
         ID            = order.get(0).get("ID");
         AddressID     = order.get(0).get("AddressID");
         PaymentTypeID = order.get(0).get("PaymentTypeID");
         CustomerID    = order.get(0).get("CustomerID");
    
  catch (IndexOutOfBoundsException e)
    Toast.makeText(this,"ERROR IndexOutOfBoundsException :. "+ e ,Toast.LENGTH_LONG).show();
  

如果你有很多订单

你可以循环

 for (int i= 0 ; i< order.size();i++)
         ID_list            = order.get(i).get("ID");
         AddressID_list     = order.get(i).get("AddressID");
         PaymentTypeID_list = order.get(i).get("PaymentTypeID");
         CustomerID_list    = order.get(i).get("CustomerID");

我想你知道剩下的部分

希望对你有帮助

【讨论】:

以上是关于如何从android中的sqlite中检索数据的主要内容,如果未能解决你的问题,请参考以下文章

从 SQLite 数据库 Android 中检索值

从 Android Studio 中的 SQLite 数据库中以字符串形式检索数据

从 Android sqlite 数据库中检索大 blob

如何从列表视图中从 sqlite 检索数据单击并查看不同的活动 android studio

如何从表1中检索列数据并使用SQLite数据库将该列值插入到Android Studio的表2中?

如何访问 Android 模拟器中的本地文件夹以检索 SQLite db?