2013-04-30 14 views
16

Moja aplikacja blokuje się podczas wykonywania operacji bazy danych po wyszukiwaniu w poszukiwaniu rozwiązań, sugerowano użycie AsyncTask, aby główny wątek nie został zablokowany.Jak wykonywać operacje na bazach danych za pomocą zadania Async

Stworzyłem oddzielną klasę i rozszerzoną wersję SQLiteOpenHelper oraz zaimplementowałem metodę "OnCreate" i "OnUpgrade". Ale aby zaimplementować AsyncTask muszę rozszerzyć "AsyncTask". Teraz mój problem polega na tym, że rozszerzyłem już jedną klasę i nie mogę rozszerzyć innej klasy dla tej samej klasy.

Mój kod jest podobny do tego.

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(); 
     } 


    }// 

Czy ktoś może zasugerować, w jaki sposób można wykonać operacje bazy danych za pomocą SQLiteOpenHelper w AsyncTask.

Dzięki Siva

+0

Można utworzyć oddzielną klasę dla AsyncTask i wywołać metodę execute(), tworząc instancję obiektu dla AsyncTask wszędzie tam, gdzie jest to wymagane. O ile mi wiadomo, AsyncTask służy do operacji sieciowych. Nie sądzę, że jest to wymagane do uzyskania dostępu do SQlite DB. – SKK

+0

Dzięki za odpowiedź Santosh .. ale moja aplikacja jest uderzana kiedy odbieram dane i logcat ma "Główny wątek robi więcej pracy ... coś takiego" stąd jestem zmuszony do korzystania z klasy Async ... Masz na myśli utwórz sheratycznie klasę Async i wywołaj ją w klasie Oncreate bazy danych? – Siva

+0

Nie, OnCreate SQLiteOpenHelper zostaje wywołana tylko raz podczas instalacji aplikacji. Przypuszczam, że chcesz użyć AsyncTask do pobierania danych. Po prostu utwórz oddzielną klasę AsyncTask w swojej działalności lub fragment i wywołaj funkcje w klasie rozszerzające SQLiteOpenHelper, aby uzyskać wynik. Mam nadzieję, że to było jasne. – SKK

Odpowiedz

13

w twojej Actvity dodaj następujący kod, wykonaj wymagane zmiany,

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(); 
     } 
    } 
} 

wykonać to przez

+0

Dzięki Atif .. ale to getContacts powinno zostać wywołane gdzieś w kodzie. Moje zapytanie o to, kiedy ta metoda zostanie nazwana wątkiem saperatu, zostanie użyte do wykonania lub główny wątek wykona operacje na bazie danych. – Siva

+0

'AsyncTask' jest zawsze wykonywany w tle spoza głównego wątku, więc operacja bazy danych będzie wykonywana w osobnym wątku. Przepraszam, jeśli nie dostałem twojego pytania. –

+0

Mam na myśli, mówiąc: Jeśli wezwę moje zadanie Async w klasie, która jest uruchamiana moim głównym wątkiem, to co się stanie? Operacje w ramach zadania asynchronicznego wykonywane są przez wątek wątku lub główny wątek – Siva

0

Nie, nie można rozszerzyć klasę od wielokrotności klasy, ponieważ narusza właściwość java, ponieważ java nie obsługuje wielokrotnego dziedziczenia, więc dla twojej sprawy musisz utworzyć nową klasę, która rozszerzy ASyncTask i zastąpi abstrakcyjne metody do pe Wykonaj wszystkie operacje związane z bazą danych. Dziękujemy

Powiązane problemy