使用后台线程和 sqlite 在按钮单击时存储数据

Storing data on button click using background thread and sqlite

提问人:ibe 提问时间:8/14/2014 最后编辑:ibe 更新时间:8/15/2014 访问量:1082

问:

[已解决] 我重新设计了整个事情:摆脱了单例模式,创建了插入值的方法并让 doInBackground() 调用它。

我有一个活动,里面有 2 个表单和一个按钮。因此,当单击按钮时,信息将存储在sqlite数据库中,一旦完成,按钮将设置为禁用。我正在使用 SQLiteOpenHelper 和 AsyncTask 来完成它。 我的问题:我应该在哪里实例化我的数据库?我错过了什么,有没有更好的方法来做这一切?

数据库助手:

public class DatabaseHelper extends SQLiteOpenHelper  {

private static DatabaseHelper singleton=null;

synchronized static DatabaseHelper getInstance(Context context) {
    if (singleton == null) {
        singleton = new DatabaseHelper(context);
    }
    return singleton;
}

private DatabaseHelper(Context context) {
    super(context, DBContract.DATABASE_NAME, null, DBContract.SCHEMA_VER);
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        db.beginTransaction();
        db.execSQL(DBContract.WordTable.CREATE_TABLE);
        db.setTransactionSuccessful();
    }
    finally {
        db.endTransaction();
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

public void saveWord(String theWord, String translatedWord) {
    ContentValues newValues = new ContentValues();

    newValues.put(DBContract.WordTable.THEWORD_COLUMN, theWord);
    newValues.put(DBContract.WordTable.TRANSLATED_COLUMN, translatedWord);

    SQLiteDatabase db = getWritableDatabase();
    db.insert(DBContract.DATABASE_NAME, null, newValues);
    }
}

主要活动:

public class MainActivity extends ActionBarActivity {

private DatabaseHelper dbhelper;
private EditText wordField, translatedField;
private Button addButton;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DatabaseHelper.getInstance(getApplicationContext());

    wordField = (EditText) findViewById(R.id.word_title);
    translatedField = (EditText) findViewById(R.id.translated_title);
    addButton = (Button) findViewById(R.id.addword_button);

    addButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            new WordSaveTask().execute(wordField.getText().toString(),translatedField.getText().toString());
        }
    });

}

private class WordSaveTask extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        dbhelper.saveWord(params[0], params[1]);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        addButton.setEnabled(false);
    }
}

}
android 多线程 sqlite android-asynctask

评论

0赞 Subby 8/14/2014
如果 DatabaseHelper 包装在单一实例中,则无需在 MainActivity 中的类级别具有它的实例。此外,您似乎没有在 MainActivity 中的任何位置调用 getInstance。最后,您可能希望在方法签名旁边放置一个关键字:.当您有多个线程访问数据库时,这很有帮助。synchronizedsynchronized public void ...
0赞 ibe 8/14/2014
我在 MainActivity 中添加了 onCreate() 方法,但是一旦我按下按钮,它就会让我退出应用程序。DatabaseHelper.getInstance(getApplicationContext())
0赞 Subby 8/15/2014
粘贴错误。告诉我们您遇到了哪些错误以及您尝试了什么,以便我们了解更多信息。
0赞 ibe 8/15/2014
在帖子中添加了错误日志。
0赞 i_turo 8/15/2014
这甚至编译了吗?扩展方法时,必须有 而不是 .AsyncTask<String, Void, Void>doInBackground()String... paramsVoid... params

答: 暂无答案