基于唯一标识符从SQLite Db检索行数据

时间:2017-10-19 15:21:30

标签: java android sqlite android-sqlite

我已经在我的应用程序中实现了一个SQLite数据库,我正在尝试编写将检索与唯一标识符相关联的行中的数据的函数。我已经尝试了很多stackoverflow的答案,似乎没有一个在我的情况下工作。

我有一个数据库助手类,我已经通过代码创建了数据库并且正在编写函数。请参阅以下代码:

public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "TrackerNew.db";
public static final String TABLE_NAME = "tracker_new_table";
public static final String COL_2 = "LINETYPE";
public static final String COL_3 = "PACKAGETYPE";
public static final String COL_4 = "QUANTITY";
public static final String COL_5 = "DURATION";
public static final String COL_6 = "STARTTIME";
public static final String COL_7 = "ENDTIME";


public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, 1); }


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME +"  (LINETYPE TEXT PRIMARY KEY,PACKAGETYPE TEXT,QUANTITY TEXT,DURATION TEXT,STARTTIME TEXT,ENDTIME TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
    onCreate(db);

}

public boolean insertData(String linetype, String packagetype, String quantity, String duration, String starttime, String endtime) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_2,linetype);
    contentValues.put(COL_3,packagetype);
    contentValues.put(COL_4,quantity);
    contentValues.put(COL_5,duration);
    contentValues.put(COL_6,starttime);
    contentValues.put(COL_7,endtime);
    long result = db.insert(TABLE_NAME,null,contentValues);
    if(result == -1)
        return false;
    else
        return true;
}

//FUNCTIONS TO GET DATA BY ROW

public Cursor getAllData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
    return res;
}

public Cursor getProgressBar1() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.query("select * from "+ TABLE_NAME + "where" + COL_2="S1");
    return res;
}

public Cursor getProgressBar2() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.query("select * from "+ TABLE_NAME + "where" + COL_2="S2");
    return res;
}

}

如果您可以在我的代码底部看到我的函数,我正在尝试编写原始查询以通过ID获取数据(S1,S2等)

任何人都可以帮我解决这些功能中的代码吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

只是尝试修改此查询:

<div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">WebSiteName</a>
    </div>

为:

Cursor res = db.query("select * from "+ TABLE_NAME + "where" + COL_2="S1");

并且在getProgressBar2()方法中也是如此。有关详细信息,请查看https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

答案 1 :(得分:0)

问题是您正在尝试使用以下方法创建字符串: -

"select * from "+ TABLE_NAME + "where" + COL_2="S1"

这不会编译,因为您错放了 = 并覆盖或省略了 + 连接。我相信你应该(见后文): -

"select * from "+ TABLE_NAME + "where" + COL_2  + "=S1"

+ 在COL_2和 = 之后添加到引号内。

然而,我认为这会失败,因为你在其中之前和之后省略了空格,所以上面的内容将解析为: -

  

从tracker_new_tablewhereLINETYPE = S1

中选择*

周围的空格如下: -

"select * from "+ TABLE_NAME + " where " + COL_2  + "=S1"

然后它将解析为: -

  

从tracker_new_table中选择*,其中LINETYPE = S1

然而,SQLite将失败,因为S1不是数字,因此必须使用引号,因此您需要实际编码: -

<强> "select * from "+ TABLE_NAME + " where " + COL_2 + "='S1'"

然而编码: -

public Cursor getProgressBar1() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.query("select * from "+ TABLE_NAME + "where" + COL_2="S1");
    return res;
}

然后会失败,因为Cursor query方法至少需要7个参数,如下所示: -

  

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

     

查询给定的表,在结果集上返回一个Cursor。   SQLiteDatabase

因此,使用query method参数将是: -

  • 1)要查询的表的名称db.query(TABLE_NAME ......
  • 2)要提取的列名的字符串数组,null表示all并等于*,因此db.query(TABLE_NAME,null ......

  • 3)选择字符串(SELECT子句)(可以包括占位符,即第4个参数的)。没有占位符db.query(TABLE_NAME,null,COL_2 + "='S1'"或占位符(通常被视为首选方法),db.query(TABLE_NAME,null,COL_2 + "=?" ......

  • 4)在一次使用的基础上替换占位符的值。因此,对于单个占位符new String[]{"S1"}可以使用,因此代码现在变为db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{"S1"} ......
  • 5)GROUP BY子句,如果不使用,则为null。
  • 6)HAVING子句,如果不使用,则为null。
  • 7)ORDER BY子句,使其不使用它。

(注意子句没有相应的KEYWORDS查询方法插入它们也处理转义/引用

完整查询可能/应该是: -

Cursor res = db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{"S1"},null,null,null);

最后

ProgressBar1 方法是: -

public Cursor getProgressBar1() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{"S1"},null,null,null);
    return res;
}

评论后编辑

如果你想搜索“S2”和“S3”,那么也许一种方法可以解决这个问题。

public Cursor getProgressBar(String linetype) {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{linetype},null,null,null);
    return res;
}

然后,对于进度条1,您可以使用: -

    Cursor progressbar1 = getProgressbar("S1");

进度条2

    Cursor progressbar2 = getProgressbar("S2");

您还可以将getProgressBar方法缩短为: -

public Cursor getProgressBar(String linetype) {
    SQLiteDatabase db = this.getWritableDatabase();
    return db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{linetype},null,null,null);
}

甚至: -

public Cursor getProgressBar(String linetype) {
    return this.getWritableDatabase().query(TABLE_NAME,null,COL_2 + "=?",new String[]{linetype},null,null,null);
}