Voici ce que j'ai fait pendant tout ce temps pour obtenir des données de ma base de données - mon fragment appellera un dbhelper qui exécutera la requête et transmettra les données résultantes dans un objet.Utilisation de Loaders avec une requête sqlite qui renvoie l'objet
J'aurais dû utiliser un chargeur pour que l'interrogation ne se fasse pas dans le thread de l'interface utilisateur, mais auparavant, je n'ai pas pris la peine car la base de données de mon application est très petite. Aller de l'avant, c'était une mauvaise idée depuis que mon application est devenue plus grande et la base de données aussi. Alors maintenant, je lis tout ce que je peux sur les chargeurs, y compris CursorLoader et les chargeurs personnalisés, mais j'ai toujours des problèmes de mise en œuvre dans mon application.
Alors, voici mon code actuel (simplifié, juste pour montrer les parties pertinentes):
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;
}
}
Quelqu'un peut-il me diriger dans la bonne direction, dans la mise en œuvre Loader la bonne façon dans mon cas ici? Si possible, je ne veux pas trop modifier les codes dans la classe DbControl - en particulier le type de données de retour des fonctions à l'intérieur.
BTW parmi les tutoriels sur les chargeurs que j'ai lu est:
- http://www.recursiverobot.com/post/60331340133/very-simple-example-of-a-loader-and-loadermanager - mais cela a été écrit il y a plus de 3 ans et il utilise Runnable pour exécuter getSupportLoaderManager, et je ne l'ai pas vu d'autres exemples/didacticiels qui fait cela, donc j'ai peur que cet article est obsolète. En outre, il utilise CursorLoader, qui à mon avis ne peut que retourner le curseur.
- http://www.grokkingandroid.com/using-loaders-in-android/ - cela semble traiter CursorLoader trop
Quoi qu'il en soit voici ce que je l'ai fait jusqu'à présent:
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?
}
}
J'ai essayé d'utiliser votre méthode, mais les codes à l'intérieur de loadInBackground ne sont pas appelés. J'ai ajouté forceload comme suggéré ici http://stackoverflow.com/questions/8606048/asynctaskloader-doesnt-run mais cela ne semble pas être une bonne idée. – imin
OK J'ai ajouté '@Override protected void onStartLoading() { if (takeContentChanged()) forceLoad(); } @Override protected void onStopLoading() { cancelLoad(); } 'et ça marche maintenant. – imin