在另一个线程中运行SQLite操作

时间:2016-08-09 12:30:31

标签: java android multithreading sqlite android-sqlite

我在Android中有一个SQLite数据库项目。我希望对它执行一些操作,例如保存一行,从表中读取所有行,删除行等。我想在另一个线程中执行该操作。我的问题是:我应该使用哪种多任务处理方法?我在考虑一个类,比如数据库管理器,它有一些方法代表我上面写的操作。我不知道如何简单易行。也许Service会帮助我完成这项任务,或者我应该为一个操作使用另一个类,例如一个操作的一个AsyncTask类?我在等你的所有答案和建议。谢谢!

2 个答案:

答案 0 :(得分:1)

我认为后台服务对于简单的数据库操作来说有点过分。

在大多数情况下,我使用带有Cursor Adapter的ListView来获取滚动所需的列表类型数据。对于较小的数据集,可能< 10行,我只是获取UI线程中的数据。

对于更复杂的操作,比如在启动时检查数据库的状态,或者删除一组行,我会为每个目的编写一个AsyncTask。

我一直在使用ORM Lite几乎所有的Android SQL lite项目,我只是按照单例DatabaseManager的惯例,在manager类中创建需要自定义查询的方法。

答案 1 :(得分:0)

您可以使用AsyncTask。在其doInBackground()方法中,您可以执行所有必需的操作,例如向表中添加内容等。

在您的活动中添加此内容。

private class myTask extends AsyncTask<Void, Void, Bitmap> {
    DataBaseHelper db=new DataBaseHelper(context);
    protected void doInBackground(Void... params) {
        db.addData(.....);
    }
}

以下是DataBaseHelper类。

public class DataBaseHelper extends SQLiteOpenHelper {
  private static final int DATABASE_VERSION = 1;

  // Database Name
  public static final String DATABASE_NAME = "YourName.db";

  // table name
  public static final String TABLE_DATA = "your Table name";
  //  Table Columns names
  public static final String KEY_ID = "id";
  public static final String KEY_NAME = "DataName";
  public static final String KEY_CONTENT = "Content";

  @Override
  public void onCreate(SQLiteDatabase db) {
    String CREATE_TABLE_DATA = "CREATE TABLE " + TABLE_DATA + "("
            + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT,"
            + KEY_CONTENT + " TEXT" + ")";
    db.execSQL(CREATE_TABLE_DATA);

  public void addData(DataBaseModel dataBaseModel) {
    SQLiteDatabase db1 = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_NAME, dataBaseModel.getDataName()); // Contact Name
    values.put(KEY_CONTENT, dataBaseModel.getContent()); // Contact Phone
    // Inserting Row
    db1.insert(TABLE_DATA, null, values);
    //Toast.makeText(context, "New row added, row id: " , Toast.LENGTH_SHORT).show();
    db1.close(); // Closing database connection
  }

  // Getting single data
  public String getData(String dataName) {
    String data=null;
    SQLiteDatabase db = this.getReadableDatabase();
    //SQLiteDatabase db2=SQLiteDatabase.openDatabase(DB_PATH + DATABASE_NAME, null, SQLiteDatabase.CREATE_IF_NECESSARY);
    Cursor cursor = db.query(TABLE_DATA, new String[]{KEY_ID,
                    KEY_NAME, KEY_CONTENT}, KEY_NAME + "=?",
            new String[]{dataName}, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();
    try {
         data = cursor.getString(cursor.getColumnIndex(KEY_CONTENT));
    }catch (Exception e){
        e.printStackTrace();
        data=null;
    }
    cursor.close();
    return data;
}