无法从数据库中检索列的数据

时间:2019-06-24 17:53:48

标签: android sqlite

我在数据库中有一个名为关键字的表。我想从该表中检索警报和位置列的数据,并且除联系人号外无法检索它们。现在我在Toast中显示它们的值,但是每次运行任何查询以显示我的警报或Toast中的位置为空。但始终显示我的contact_number。不了解此问题的原因。我还检查了表视图,并在其中显示了警报值,位置

Create Table keywords( contact_number text primary key  , alarm text  , location text )

我的插入函数是

  public boolean insertkeys (String alarm ,String location ,String contact){

        SQLiteDatabase db = this.getWritableDatabase();
        //ContentValues is a name value pair, used to insert or update values into database tables.
        // ContentValues object will be passed to SQLiteDataBase objects insert() and update() functions.
        //  ContentValues contentValues = new ContentValues();
        ContentValues contentValues = new ContentValues();


        contentValues.put("alarm",alarm);
        contentValues.put("location",location);
        contentValues.put("contact_number",contact);
        long ins = db.insert("keywords",null,contentValues);
        long upd = db.update("keywords",contentValues,"contact_number = ?",new String[]{contact});
        //  db.close();
        if(ins == -1 && upd == -1)
            return  false;
        else
            return true;
    }

每次单击保存按钮时,我都会插入并更新数据。这里有人可以告诉我如何编写查询以检索这些字段的数据并将其设置为Toast或Edit text。我是Database的新手,在这里呆了大约一周。预先感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

您通过 SELECT 查询提取数据,该查询在使用Android SDK时作为游标返回。

Cursor与表类似,它具有许多行,每行都有由您选择的内容决定的列数。

要获取所有行,SELECT查询将遵循:-

`SELECT * FROM keywords`

要使用Android SDK进行此操作,您可以使用 SQLiteDatabase query 便捷方法,例如对于上述内容,您可以使用:-

Cursor cursor = db.query("keywords",null,null,null,null,null,null);
  • 在上面的链接中检查可以传递的值/参数以及它们与SELECT语句的关系。

然后通常使用Cursor move ??? 方法遍历返回的游标以提取数据。注意如果无法进行移动,大多数将返回false,并且注意光标在原始位置在第一行之前

这样,您可以有一个根据以下方法返回Cursor的方法:-

public Cursor getAllKeys(){

    SQLiteDatabase db = this.getWritableDatabase();
    return db.query("keywords",null,null,null,null,null,null);
}

然后可以使用:-

处理所有行
Cursor csr = yourDBHelper.getAllKeys();
while (csr.moveToNext()) {
    String current_contact_number = csr.getString(csr.getColumnIndex("contact_number");
    String current_alarm = csr.getString(csr.getColumnIndex("alarm");
    String current_location = csr.getString(csr.getColumnIndex("location"));
    ...... your code to Toast or use the retrieved values       
}
csr.close(); //<<<<<<<<<< you should always close a Cursor when finished with it.

其他

关于评论:-

  

您建议我尝试对其进行更改的游标查询   像放列和where子句,但之后它返回我   当我执行它时什么都没有。您能告诉我该查询吗?

以下可能是一种根据联系人号码仅检索警报的方法。

public String getAlarmByContactNumber(String contactNumber){

    String rv = "";
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor csr = db.query(
        "keywords", //<<<<<<<<<<<< the FROM clause (less the FROM keyword) typically the name of the table from which the data is to be extracted (but can include JOINS for example, for more complex queries)
        new String[]{"alarm"}, //<<<<<<<<<< A String[] of the column names to be extracted (null equates to * which means all columns) (note can be more complex and include functions/sub queries)
        "contact_number=?", //<<<<<<<<<< WHERE clause (less the WHERE keyword) note **?** are place holders for parameters passed as 4th argument
        new String[]{contactNumber},
        null, //<<<<<<<<<< GROUP BY clause (less the GROUP BY keywords)
        null, //<<<<<<<<<< HAVING clause (less the HAVING keyword)
        null  //<<<<<<<<<< ORDER BY clause (less the ORDER BY keywords)
    );
    if (csr.moveToFirst()) {
        rv = csr.getString(csr.getColumnIndex("alarm"));
    }
    csr.close();
    return rv;
}
  • 以上假设您每个联系电话只会有/想要一个警报。
  • 以上是原理代码,尚未运行或测试,因此可能包含一些小错误。