В моем текущем проекте 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». Я пробовал очистить проект, но безрезультатно.
Может ли кто-нибудь указать мне в правильном направлении? Благодаря!
Это исправили «не может решить символ» ошибка, однако реализации выше код выдает следующее сообщение об ошибке: «com.hadleyresearch .apptest.TscDatabase 'не является закрывающим классом –
Затем добавьте код TscDatabase в вопрос. –
@Gaurav: Дом с работы; добавлен полный код для TscDatabase на вопрос. Любая помощь, которую вы или другие можете оказать, будет очень благодарна, спасибо. –