2015-06-16 3 views
0

В моем текущем проекте Android используется база данных SQLite. Согласно документации, доступной по этому вопросу, операции с базой данных могут быть длительными в зависимости от размера базы данных, поэтому рекомендуется использовать AsyncTask, особенно для больших наборов данных. Я, таким образом, реализовать операции в моем классе базы данных, как AsyncTasks:Проблемы с AsyncTask от SQLiteAssetHelper

package com.hadleyresearch.apptest; 

import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.AsyncTask; 
import android.support.v4.content.LocalBroadcastManager; 

import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; 

public class TscDatabase extends SQLiteAssetHelper{ 

    private static final String DATABASE_NAME = "database.db"; 
    private static final int DATABASE_VERSION = 1; 

    final private Context db_context; 

    //Action Strings 
    public static final String DEVICE_LIST_AVAILABLE = 
      "com.hadleyresearch.apptest.DEVICE_LIST_AVAILABLE"; 
    public static final String FUNCTION_LIST_AVAILABLE = 
      "com.hadleyresearch.apptest.FUNCTION_LIST_AVAILABLE"; 
    public static final String DEVICE_PROFILE_AVAILABLE = 
      "com.hadleyresearch.apptest.DEVICE_PROFILE_AVAILABLE"; 

    public TscDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     db_context = context; 
     // An alternate constructor can be used here to specify a 
     // different database location, such as an SD card. This folder 
     // must be available and permissions must be included to write 
     // to it. 
     //super(context, DATABASE_NAME, context.getExternalFilesDir(null).getAbsolutePath(), null, DATABASE_VERSION); 
    } 

    private class ListDevices extends AsyncTask<Void, Void, Cursor> { 
     SQLiteDatabase db; 

     @Override 
     protected Cursor doInBackground(Void... params) { 
      db = getReadableDatabase(); 
      String sqlTable = "Devices"; 
      String[] sqlColumns = {"_id", "deviceAddr", "deviceName", "deviceType"}; 
      Cursor c = db.query(sqlTable, sqlColumns, null, null, null, null, null); 
      c.moveToFirst(); 
      return c; 
     } 

     @Override 
     protected void onPostExecute(Cursor result) { 
      broadcastUpdate(DEVICE_LIST_AVAILABLE, result); 
      db.close(); 
     } 

    } 

    public class GetDevice extends AsyncTask<String, Void, Cursor> { 
     SQLiteDatabase db; 

     protected Cursor doInBackground(String... device) { 
      db = getReadableDatabase(); 
      String sqlTable = "Devices"; 
      //String[] sqlColumns = {"_id", "deviceAddr", "deviceName", "deviceType"}; 
      String[] sqlColumns = null; 
      String sqlWhere = "deviceProfile = ?"; 
      String[] whereArgs = new String[] {device.toString()}; 
      Cursor c = db.query(sqlTable, sqlColumns, sqlWhere, whereArgs, null, null, null); 
      c.moveToFirst(); 
      return c; 
     } 

     protected void onPostExecute(Cursor result) { 
      broadcastUpdate(DEVICE_PROFILE_AVAILABLE, result); 
      db.close(); 
     } 
    } 

    //TODO - Implement listFunctions() command 
    // listFunctions() - list out mappable TactSense Functions 
    private class ListFunctions extends AsyncTask<Void, Void, Cursor> { 
     SQLiteDatabase db; 

     @Override 
     protected Cursor doInBackground(Void... params) { 
      db = getReadableDatabase(); 
      String sqlTable = "Functions"; 
      String[] sqlColumns = {"_id", "FunctionID", "FunctionName"}; 
      Cursor c = db.query(sqlTable, sqlColumns, null, null, null, null, null); 
      c.moveToFirst(); 
      return c; 
     } 

     @Override 
     protected void onPostExecute(Cursor result) { 
      broadcastUpdate(FUNCTION_LIST_AVAILABLE, result); 
      db.close(); 
     } 

    } 

    private void broadcastUpdate(final String action) { 
     final Intent intent = new Intent(action); 
     LocalBroadcastManager.getInstance(db_context).sendBroadcast(intent); 
    } 

    private void broadcastUpdate(final String action, 
           final Cursor cursor) { 
     final Intent intent = new Intent(action); 
     intent.putExtras(cursor.getExtras()); 
     LocalBroadcastManager.getInstance(db_context).sendBroadcast(intent); 
    } 
} 

После этого, я называю AsyncTask внутри службы:

@Override 
 
    public IBinder onBind(Intent intent) { 
 
     initialize(); 
 
     db = new TscDatabase(this); 
 
     new db.GetDevice().execute(device); 
 
     return mBinder; 
 
    }

Android-студия, казалось бы, в курсе существование GetDevice как метода db, так как он предлагает его мне как пример автозаполнения. Однако после автозаполнения он выделяет его красным цветом и дает мне ошибку «Не удается разрешить символ GetDevice». Я пробовал очистить проект, но безрезультатно.

Может ли кто-нибудь указать мне в правильном направлении? Благодаря!

ответ

1

ваш класс-структура не вполне ясна, но это должно работать:

@Override 
public IBinder onBind(Intent intent) { 
    initialize(); 
    db = new TscDatabase(this); 
    TscDatabase.GetDevice asyncDev = new TscDatabase.GetDevice(); 
    asyncDev.execute(device); 
    return mBinder; 
} 
+0

Это исправили «не может решить символ» ошибка, однако реализации выше код выдает следующее сообщение об ошибке: «com.hadleyresearch .apptest.TscDatabase 'не является закрывающим классом –

+0

Затем добавьте код TscDatabase в вопрос. –

+0

@Gaurav: Дом с работы; добавлен полный код для TscDatabase на вопрос. Любая помощь, которую вы или другие можете оказать, будет очень благодарна, спасибо. –

Смежные вопросы