Использование CursorLoader для запроса SQLite DB и заполнения AutoCompleteTextView

У меня есть база данных SQLite, которую я бы хотел запросить. Я хочу настроить Android 2.2 на ICS. Я столкнулся с этой статьей о том, как это сделать, но использует устаревший код (не запрашивает асинхронно, а в потоке пользовательского интерфейса). С тех пор я прочитал, что я могу использовать CursorLoader вместе с LoaderManager чтобы сделать эту задачу предпочтительным, наилучшим способом (чтобы не портить поток пользовательского интерфейса).

Проблема заключается в том, чтобы найти краткий пример, чтобы объяснить мне, как это сделать. 1) Загрузите базу данных, 2) запросите ее, 3) используйте результат, чтобы заполнить вид списка автокомплектов.

Существует ли такой пример?

Solutions Collecting From Web of "Использование CursorLoader для запроса SQLite DB и заполнения AutoCompleteTextView"

Я знаю, что это старый вопрос, но для людей, которые посещают эту страницу:

У SimpleCursorAdapter есть новый конструктор:

 SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) 

Этот cunstructor не использует поток пользовательского интерфейса. Вы можете использовать его в безопасности.

Я создал класс 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); } 

Чтобы заполнить Auto Autocomplete 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

У меня нет кода под рукой, но я задал аналогичный вопрос:

Android-чат для загрузки чата для чата

Если вы внимательно прочитаете это, вы можете выяснить, как использовать CursorLoader для вашей базы данных sqlite;)