我已经在我的应用程序中实现了一个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等)
任何人都可以帮我解决这些功能中的代码吗?
谢谢!
答案 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
参数将是: -
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 + "=?" ......
new String[]{"S1"}
可以使用,因此代码现在变为db.query(TABLE_NAME,null,COL_2 + "=?",new String[]{"S1"} ......
(注意子句没有相应的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);
}