从之前在 Android 中创建的 SQLite 数据库中搜索和检索特定数据?
Searching and retrieving specific data from a previously created SQLite Database in Android?
我有一个 SQLite 数据库,它是在 SQLite 浏览器中创建的,并通过 SQLite Asset Helper 库导出到我的 Android 应用程序。此数据库用于只读任务,无法升级或修改。
现在我想在特定列中搜索用户在 TextView 中输入的任何数据,如果数据与该列的某些值匹配,则检索与其他列对应的所有值。
例如:
TABLE FRUITS
_id NAME URL
1 apple R.drawable.apple
2 orange R.drawable.orange
3 kiwi R.drawable.kiwi
由于我的应用程序只允许用户输入 NAME 字段,查询只需要在 NAME 列中搜索,并且只有在数据库中存在 URL 值,否则将 return 没什么。
这是我导入数据库的代码:
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "fruitManager";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public Cursor answerRequest(String request) {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String sqlTables = "FRUITS";
qb.setTables(sqlTables);
String[] sqlSelect = {"0 _id", "NAME", "0 URL"};
Cursor c = qb.query(db, sqlSelect, null, null,
null, null, null);
return c;
}
}
然后我从这里提出了请求:
public class Request {
private Cursor cursor;
private MyDatabase db;
String request;
String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite_asset_helper);
public void onClick(View v) {
request = mEdit.getText().toString().toLowerCase();
db = new MyDatabase(this);
cursor = db.answerRequest(request);
url = cursor.getString(c.getColumnIndex("NAME"));
System.out.println("Your request was: " + request +
" and has this URL: " + url);
}
}
protected void onDestroy() {
super.onDestroy();
cursor.close();
db.close();
}
仍然,执行查询需要大量代码,但我不知道在这种情况下如何实现它们(由于导入的数据库)。提前致谢。
更新:我有点绝望所以如果你没有答案但知道完成任务的替代方法(比如使用另一个数据库处理程序而不是 SQLite)我会接受你的建议作为正确答案。
唯一的限制是:必须是离线解决方案(访问数据库不需要互联网连接)。
您当前的查询如下所示:
`select 0 _id, NAME, 0 URL from FRUITS`
请注意,您没有在任何地方使用请求字符串。您还选择了整数文字 0
并将其别名为其他列名——似乎没有任何理由这样做。照原样,您的结果将是
_id NAME URL
0 apple 0
0 orange 0
0 kiwi 0
你想要的是:
`select * from FRUITS where NAME = request`
我会这样写:
public Cursor answerRequest(String request) {
SQLiteDatabase db = getReadableDatabase();
String table = "FRUITS";
String where = "NAME = ?";
String[] whereArgs = {request};
// select * from fruits where name = request
return db.query(table, null, where, whereArgs, null, null, null);
}
当您想要检索值时在其他地方:
db = new MyDatabase(this);
Cursor cursor = db.answerRequest(request);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
// cursor is not empty, read values here
String url = cursor.getString(cursor.getColumnIndex("URL"));
}
} finally {
cursor.close();
}
}
我有一个 SQLite 数据库,它是在 SQLite 浏览器中创建的,并通过 SQLite Asset Helper 库导出到我的 Android 应用程序。此数据库用于只读任务,无法升级或修改。
现在我想在特定列中搜索用户在 TextView 中输入的任何数据,如果数据与该列的某些值匹配,则检索与其他列对应的所有值。
例如:
TABLE FRUITS
_id NAME URL
1 apple R.drawable.apple
2 orange R.drawable.orange
3 kiwi R.drawable.kiwi
由于我的应用程序只允许用户输入 NAME 字段,查询只需要在 NAME 列中搜索,并且只有在数据库中存在 URL 值,否则将 return 没什么。
这是我导入数据库的代码:
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
public class MyDatabase extends SQLiteAssetHelper {
private static final String DATABASE_NAME = "fruitManager";
private static final int DATABASE_VERSION = 1;
public MyDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public Cursor answerRequest(String request) {
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
String sqlTables = "FRUITS";
qb.setTables(sqlTables);
String[] sqlSelect = {"0 _id", "NAME", "0 URL"};
Cursor c = qb.query(db, sqlSelect, null, null,
null, null, null);
return c;
}
}
然后我从这里提出了请求:
public class Request {
private Cursor cursor;
private MyDatabase db;
String request;
String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite_asset_helper);
public void onClick(View v) {
request = mEdit.getText().toString().toLowerCase();
db = new MyDatabase(this);
cursor = db.answerRequest(request);
url = cursor.getString(c.getColumnIndex("NAME"));
System.out.println("Your request was: " + request +
" and has this URL: " + url);
}
}
protected void onDestroy() {
super.onDestroy();
cursor.close();
db.close();
}
仍然,执行查询需要大量代码,但我不知道在这种情况下如何实现它们(由于导入的数据库)。提前致谢。
更新:我有点绝望所以如果你没有答案但知道完成任务的替代方法(比如使用另一个数据库处理程序而不是 SQLite)我会接受你的建议作为正确答案。 唯一的限制是:必须是离线解决方案(访问数据库不需要互联网连接)。
您当前的查询如下所示:
`select 0 _id, NAME, 0 URL from FRUITS`
请注意,您没有在任何地方使用请求字符串。您还选择了整数文字 0
并将其别名为其他列名——似乎没有任何理由这样做。照原样,您的结果将是
_id NAME URL
0 apple 0
0 orange 0
0 kiwi 0
你想要的是:
`select * from FRUITS where NAME = request`
我会这样写:
public Cursor answerRequest(String request) {
SQLiteDatabase db = getReadableDatabase();
String table = "FRUITS";
String where = "NAME = ?";
String[] whereArgs = {request};
// select * from fruits where name = request
return db.query(table, null, where, whereArgs, null, null, null);
}
当您想要检索值时在其他地方:
db = new MyDatabase(this);
Cursor cursor = db.answerRequest(request);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
// cursor is not empty, read values here
String url = cursor.getString(cursor.getColumnIndex("URL"));
}
} finally {
cursor.close();
}
}