【发布时间】:2016-11-01 17:39:12
【问题描述】:
这是我在从数据库中获取数据时一直在做的事情——我的片段将调用一个 dbhelper,它将运行查询并将结果数据传递到一个对象中。
我应该使用加载器,这样查询就不会在 UI 线程中完成,但以前我没有打扰,因为我的应用程序的数据库非常小。展望未来,这是一个坏主意,因为我的应用程序变得越来越大,数据库也越来越大。所以现在我正在阅读有关加载器的所有内容,包括 CursorLoader 和自定义加载器,但在我的应用程序中实现它仍然存在问题。
所以这是我当前的代码(简化,只是为了显示相关部分):
public class CategoryEdit extends Fragment{
private DbControl dbc;
private ObjectCategory objCategory;
private int categoryID = 3;
private EditText etName;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
dbc = new DbControl(getActivity());
try{
dbc.open();
objCategory = new ObjectCategory();
objCategory = dbc.getCategoryData(categoryID);
dbc.close();
}catch (SQLException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
etName.setText(objCategory.name);
}
}
public class DbControl {
public static final String FILE_NAME = "DbControl.java";
private SQLiteDatabase database;
private MySQLiteHelper dbHelper;
public DbControl(Context context) {
dbHelper = new MySQLiteHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public ObjectCategory getCategoryData(int itemID) throws Exception{
ObjectCategory objCategory = new ObjectCategory();
Cursor cursor = database.query(MySQLiteHelper.TABLE_CATEGORY, new String[] {"name"},
"id = " + itemID, null, null, null, null);
if (cursor!=null && cursor.getCount()>0 && cursor.moveToFirst()) {
objCategory.name = cursor.getString(cursor.getColumnIndex("name"));
}
return objCategory;
}
}
谁能指出我正确的方向,在我这里以正确的方式实施 Loader?如果可能的话,我不想过多地更改 DbControl 类中的代码——尤其是其中的函数的返回数据类型。
顺便说一句,我读过的关于加载器的教程是:
- http://www.recursiverobot.com/post/60331340133/very-simple-example-of-a-loader-and-loadermanager - 但这是 3 年前写的,它使用 Runnable 来执行 getSupportLoaderManager,我还没有看到其他示例/教程这样做,所以我担心这篇文章已经过时了。此外,它使用 CursorLoader,据我了解,它只能返回光标。
- http://www.grokkingandroid.com/using-loaders-in-android/ - 这似乎也与 CursorLoader 打交道
无论如何,这是我到目前为止所做的:
public class CategoryEdit extends Fragment implements LoaderManager.LoaderCallbacks<ObjectCategory> {
@Override
public Loader<ObjectCategory> onCreateLoader(int id, Bundle args){
try{
dbc.open();
objCategory = new ObjectCategory();
objCategory = dbc.getCategoryData(categoryID);
dbc.close();
}catch (SQLException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
return objCategory; //this returns error, it says required Loader<ObjectCategory> instead of objCategory, but I'm not sure how to do that here
}
@Override
public void onLoadFinished(Loader<ObjectCategory> cursorLoader, ObjectCategory cursor) {
//Since onCreateLoader has error above, I'm not sure how to implement this part
}
@Override
public void onLoaderReset(Loader<ObjectCategory> cursorLoader) {
//Can I just leave this empty?
}
}
【问题讨论】:
标签: android android-sqlite loader