2013-04-30 6 views
16

Meine Anwendung bleibt beim Ausführen der Datenbankoperation nach dem Durchsuchen von Lösungen hängen. Es wurde vorgeschlagen, dass ich AsyncTask verwende, damit der Hauptthread nicht blockiert wird.So führen Sie Datenbankvorgänge mit Async-Task aus

Ich habe separate Klasse und erweiterte SQLiteOpenHelper erstellt und implementiert "OnCreate" und "OnUpgrade" -Methode. Aber um AsyncTask zu implementieren, muss ich "AsyncTask" erweitern. Jetzt ist mein Problem hier, dass ich bereits eine Klasse erweitert habe und ich kann keine weitere Klasse für die gleiche Klasse erweitern.

Mein Code ist so etwas.

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


    }// 

Kann jemand empfehlen, wie ich Datenbankoperationen mit SQLiteOpenHelper innerhalb eines AsyncTask durchführen kann.

Dank Siva

+0

Sie könnten eine separate Klasse für AsyncTask erstellen und die execute() -Methode aufrufen, indem Sie ein Objekt für Ihre AsyncTask an einer beliebigen Stelle instanziieren. Soweit ich weiß, wird AsyncTask für Netzwerkoperationen verwendet. Ich denke nicht, dass es für den Zugriff auf SQlite DB erforderlich ist. – SKK

+0

Danke für die Antwort Santosh .. aber meine Anwendung wird getroffen, wenn ich die Daten retrahieren und Logcat hat "Main Thread macht mehr Arbeit ... so etwas in der Art" daher bin ich gezwungen, Async-Klasse zu verwenden ... Du meinst Erstellen Sie eine Async-Klasse seperat und rufen Sie sie in Oncreate der Datenbankklasse auf? – Siva

+0

Nein, OnCreate von SQLiteOpenHelper wird nur einmal aufgerufen, wenn Sie die Anwendung installieren. Ich nehme an, dass Sie die AsyncTask verwenden möchten, um Daten abzurufen. Erstellen Sie einfach eine separate AsyncTask-Klasse in Ihrer Aktivität oder Ihrem Fragment und rufen Sie Funktionen in Ihrer Klasse auf, um SQLiteOpenHelper zu erweitern, um das Ergebnis zu erhalten. Hoffe das war klar. – SKK

Antwort

13

In Ihrem Actvity den folgenden Code hinzuzufügen, führen Sie die erforderlichen Änderungen,

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

dies durch

+0

Danke Atif .. aber diese getContacts sollten irgendwo im Code aufgerufen werden. Meine Abfrage ist hier, wenn diese Methode aufgerufen wird, wird saperate thread verwendet, um ausgeführt zu werden, oder main thread führt die Datenbankoperationen aus. – Siva

+0

'AsyncTask' wird immer im Hintergrund und nicht im Hauptthread ausgeführt, daher wird der Datenbankvorgang in einem separaten Thread ausgeführt. Entschuldigung, wenn ich deine Frage nicht bekommen habe. –

+0

Ich meine zu sagen Wenn ich meine Async-Aufgabe in einer Klasse, die meinen Haupt-Thread ausgeführt wird, dann was passiert? Operationen unter Async-Task werden von seperaten Threads oder Hauptthreads ausgeführt. – Siva

0

ausführen Nein, Sie mehrere eine Klasse von nicht verlängern Klassen, da es gegen die Eigenschaft von Java verstößt, weil Java keine Mehrfachvererbung unterstützt, also müssen Sie für Ihren Fall eine neue Klasse erstellen, die ASyncTask erweitert und die abstrakten Methoden auf pe überschreibt Richten Sie alle datenbankbezogenen Vorgänge aus. Danke

Verwandte Themen