簡體   English   中英

根據唯一標識符從SQLite Db檢索行數據

[英]Retrieving row data from SQLite Db based on Unique Identifier

我已經在我的應用程序中實現了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等)獲取數據。

誰能幫我解決這些函數中的代碼?

謝謝!

只需嘗試修改此查詢:

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

至:

Cursor res = db.rawQuery("select * from "+ TABLE_NAME + " where " + COL_2 + " = ?", new String[] {"S1"});

以及在getProgressBar2()方法中。 有關更多信息,請訪問https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

問題是您嘗試使用以下方法創建字符串:

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

由於您放錯了=並覆蓋或省略了+串聯,因此無法編譯。 我相信您應該擁有(請參閱下文):

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

+在COL_2之后添加,並且=在引號內移動。

但是,我然后認為這將失敗,因為您在where之前和之后省略了空格,因此上述內容將解析為:-

選擇* from 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。 SQLite數據庫

因此,使用query method ,參數為:

  • 1)要查詢的表的名稱,所以db.query(TABLE_NAME ......
  • 2)要提取的列名稱的字符串數組,null表示全部並等於*,因此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子句,不使用一個子句將其為null。

(注意子句沒有查詢方法插入它們的相應關鍵字,它也處理轉義/引用

完整查詢可以/應該是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM