我有一个想查询的SQLite数据库。我想通过ICS定位Android 2.2。我遇到了关于如何执行此操作的this文章,但它使用了弃用的代码(不是异步查询,而是在UI线程上)。我已经读过,我可以使用CursorLoader
和LoaderManager
来执行此任务,这是首选的最佳实践方式(不会让UI线程陷入困境)。
问题是找到一个简洁的示例来向我解释如何执行此操作。 1)加载数据库,2)查询它,3)使用结果填充AutoCompletetextBox列表视图。
这样的例子存在吗?
答案 0 :(得分:1)
我知道这是一个老问题,但对于访问此页面的人来说:
SimpleCursorAdapter有一个新的构造函数:
SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)
此构造函数不使用UI线程。你可以安全地使用它。
答案 1 :(得分:0)
我创建了一个SQLiteHelper类。我的情况,我有一个sqlite数据库,我从资产文件夹复制到/ data / data目录,如果不存在:
private DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, DB_NAME, null, 1);
this.mContext = context;
}
// getInstance() singleton
public static synchronized DatabaseHelper getInstance(Context context) {
if (_instance == null) {
_instance = new DatabaseHelper(context,null,null,1);
}
return _instance;
}
@Override
public void onCreate(SQLiteDatabase db) {
// Leave it blank, we don't want to create.
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Leave it blank, we don't want to upgrade
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
openDataBase();
// check the version number;
SQLiteCursor cursor = runQuery("select versionNumber from version where VersionType = \"CURRENT\"");
if (cursor!=null){
cursor.moveToFirst();
int version = cursor.getInt(cursor.getColumnIndex("versionNumber"));
if (version!=SQL_VERSION){
//TODO - grab the favorites and ingredients first.
ArrayList<String> favorites = getFavorites();
// I think I need to close the db before erasing it, then open new one.
close();
mContext.deleteDatabase(DB_NAME);
this.getReadableDatabase();
copyDataBase();
openDataBase();
for (int i = 0; i<favorites.size();i++){
insert(Constants.TABLE_FAVORITES,Constants.FAVORITE,favorites.get(i));
}
close();
}
}
}else{
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getReadableDatabase();
copyDataBase();
}
}
private void copyDataBase(){
//Open your local db as the input stream
InputStream myInput;
try {
myInput = mContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = LOCATION + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = LOCATION + DB_NAME;
mDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if(mDatabase != null)
mDatabase.close();
super.close();
}
public SQLiteCursor runQuery(String query){
return (SQLiteCursor) mDatabase.rawQuery(query,null);
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = LOCATION + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
// all insert does is insert to favorites and into your bar.
public void insert(String table, String column, String value) {
ContentValues values = new ContentValues();
values.put(column, value);
mDatabase.insert(table, null, values);
}
public void delete(String table, String column, String value){
mDatabase.delete(table,column+" = \""+value+"\"",null);
}
在我的活动中填写自动自动填充TextView:
startManagingCursor(mCursor);
// get instance of database helper class
mDatabaseHelper = DatabaseHelper.getInstance(this);
// create database for first time
try {
mDatabaseHelper.createDataBase();
} catch (IOException e) {
//Log.i(TAG,"Could not create the database");
e.printStackTrace();
}
// open the database
mDatabaseHelper.openDataBase();
mDrinks = this.populate();
填充方法:
//populates by drinks
private ArrayList<String> populate() {
ArrayList<String> items = new ArrayList<String>();
mCursor = mDatabaseHelper.runQuery(
"select "+ Constants.TITLE +" from "
+Constants.TABLE_DRINK+" order by "
+Constants.TITLE);
if (mCursor != null){
mCursor.moveToFirst();
while (!mCursor.isAfterLast()){
items.add(mCursor.getString(mCursor.getColumnIndex(Constants.TITLE)));
mCursor.moveToNext();
}
}
return items;
}
然后我设置它:
// when text changes, autocomplete happens
mSearchTextView = (AutoCompleteTextView) findViewById(R.id.search_drink);
mSearchTextView.setAdapter(
new ArrayAdapter<String>(
this, R.layout.list_item, mDrinks));
mSearchTextView.setClickable(true);
// clear the text when the searchTextView is clicked. Necessary for
// clearing after pressing enter in an invalid drink.
mSearchTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSearchTextView.setText("");
}
});
mSearchTextView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long arg3) {
// TODO - here we need to get the name, then search for ingredients and show everything in
// an alert dialog. Here is main logic.
buildDialog(parent.getItemAtPosition(position).toString());
}
});
mSearchTextView.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(mSearchTextView
.getApplicationWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
Toast.makeText(v.getContext(), "Please Select a Drink from the Auto Complete or the List Shown", Toast.LENGTH_LONG).show();
}
return false;
}
});
希望你理解。我不能给你我的全部资源,因为这是我开发的市场应用程序。在尝试完成所有工作之前,您可以查看它: https://play.google.com/store/apps/details?id=com.life.plus.studios.bartender.drink.recipes.light
答案 2 :(得分:0)
我手头没有代码,但之前我问过类似的问题:
Android db loading chat for chat application
如果你仔细阅读,你可以弄清楚如何为你的sqlite数据库使用CursorLoader;)