[英]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
,參數為:
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 + "=?" ......
new String[]{"S1"}
,因此代碼現在變為db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{"S1"} ......
(注意子句沒有查詢方法插入它們的相應關鍵字,它也處理轉義/引用 )
完整查詢可以/應該是:
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.