web-dev-qa-db-fra.com

Comment effectuer des opérations de base de données en utilisant Async Task

Mon application est bloquée lors de l'exécution d'une opération de base de données après la recherche de solutions, il a été suggéré d'utiliser AsyncTask afin que le thread principal ne soit pas bloqué.

J'ai créé une classe séparée, étendu SQLiteOpenHelper et mis en œuvre les méthodes "OnCreate" et "OnUpgrade". Mais pour implémenter AsyncTask, j'ai besoin d'étendre "AsyncTask". Maintenant, mon problème est que j'ai déjà prolongé une classe et que je ne peux pas étendre une autre classe pour la même classe.

Mon code est quelque chose comme ça.

import Android.content.Context;
import Android.database.Cursor;
import Android.database.DatabaseErrorHandler;
import Android.database.sqlite.SQLiteDatabase;
import Android.database.sqlite.SQLiteDatabase.CursorFactory;
import Android.database.sqlite.SQLiteOpenHelper;
import Android.util.Log;
import Android.widget.Toast;

import com.example.project.R;

public class Database  extends SQLiteOpenHelper{

    static final String dbname="Project";
    static final int dbversion=1;

    TableA r=new TableA();


    SQLiteDatabase db;
    private Context Context;
    public Database(Context context) {
        super(context,  dbname, null, dbversion);
        try{
        db=getWritableDatabase();
        // TODO Auto-generated constructor stub
        if (db.isOpen()){

            System.out.println("Database is opened");
        }
            else{


                System.out.println("Database is not opened");
            }

        }
        catch(Exception e){

            Log.e(dbname, e.getMessage());

        }
    }


    @Override
    public void onCreate(SQLiteDatabase db) {

        // TODO Auto-generated method stub
        try{
        db.beginTransaction();

        db.execSQL(r.r_Table);


        db.insert(r.Tablename, null, r.insertdata());
        db.setTransactionSuccessful();
        retrivedata();
        }
        catch(Exception e){

            Android.util.Log.e(r.Tablename, e.getMessage());

        }

        finally{

            db.endTransaction();
        }


    }//

Quelqu'un peut-il suggérer comment je peux effectuer des opérations de base de données avec SQLiteOpenHelper dans une AsyncTask.

Merci Siva

16
Siva

Dans votre Actvity, ajoutez le code suivant, effectuez les modifications requises,

private class GetContacts extends AsyncTask<Object, Object, Cursor> {
    DatabaseConnector dbConnector = new DatabaseConnector(
            getApplicationContext());

    @Override
    protected Cursor doInBackground(Object... params) {
        dbConnector.open();
        if (dbConnector.getAllValues() != null) {
            return dbConnector.getAllValues();
        } else
            return null;
    }

    @Override
    protected void onPostExecute(Cursor result) {
        if (result != null) {
            conAdapter.changeCursor(result); // set the adapter's Cursor
            dbConnector.close();
        }
    }
}

exécuter ceci par new GetContacts().execute((Object[]) null);

14
Atif Farrukh

Non, vous ne pouvez pas étendre une classe à partir de plusieurs classes car elle enfreint la propriété de Java, car Java ne supporte pas l'héritage multiple, vous devez donc créer une nouvelle classe qui étendra ASyncTask et surchargera les méthodes les opérations liées à la base de données . Merci

0
Pankaj Kumar