Я думаю, что есть 2 способа:
- в
onPause
-метод и отметьте там isFinishing
, если да -> закрыть. Проблема: если ваше приложение убито app-killer, база данных остается открытой.
- Вы открываете и закрываете БД каждый раз (методы), которые вы читаете / пишете.
EDIT:
Хорошо, я понимаю, почему это может быть вызвано. Я думаю, вы неправильно поняли использование SQLiteOpenHelper
. Вам никогда не придется вызывать onCreate
-метод.
Конечно, лучший способ - создать класс DBHelper
и использовать его в отдельных вызовах, скажем, SQLDataHandler
.
Ваша деятельность выглядит хорошо. Я изменил несколько вещей, посмотрите, поможет ли это. Я отмечу их:
Это все, что должно быть в классе Helper:
public static class OpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "database.db";
private static final int DATABASE_VERSION = 1;
protected static final String TABLE_NAME = "table";
protected String TAG = "HoursPerDayDataHelper";
Просто оставьте его CREATE TABLE
он будет создан / вызван, только если он не существует.
Я видел ошибки, возникающие при прямой передаче строки
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE "
+ TABLE_NAME
+ "(id INTEGER PRIMARY KEY AUTOINCREMENT, duration TIME, date DATE, current_time TIME)";
db.execSQL(query);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
Для использования:
Просто позвоните в ваш DataHandler
класс:
OpenHelper helper = new OpenHelper(ctx);
// SQLiteDatabase db = helper.getReadableDatabase();
SQLiteDatabase db = helper.getWritableDatabase();
Все другие вещи, такие как удаление, добавление и т. Д., Должны выполняться в классе «DataHandler».
Просто используйте те же два метода, чтобы получить вашу БД. В конце, когда вы закончите, вы звоните только в вас DataHandler
класс db.close()
.
Таким образом, сама деятельность никогда не использует де БД напрямую. Думаю, лучше практиковаться;)
Надеюсь, это поможет. По любым другим вопросам просто задавайте:)
EDIT2:
Во-первых, в общем случае он должен работать с внутренним классом.
НО: если вы хотите добавить другую таблицу из другого класса, она больше не будет работать. Вот почему это лучший способ поместить его в отдельный класс с самого начала. Его можно использовать многократно (с небольшими изменениями).
Поместите код, который я разместил в вашем классе OpenHelper. Ничего больше.
Затем поместите материал для манипулирования данными в класс, который называется что-то вроде: DataHandlerDB .
Пример кода:
package ...;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DataHandlerDB {
public static void persistAll(Context ctx, List<Module> moduleList) {
DatabaseHelper helper = new DatabaseHelper(ctx);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
for (Module m : moduleList) {
values.put("_id", m.get_id());
values.put("name", m.getModule());
db.insert("module", null, values);
}
db.close();
}
public static List<Module> findAll(Context ctx) {
List<Module> result = new ArrayList<Module>();
DatabaseHelper helper = new DatabaseHelper(ctx);
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query(ModuleDB.TABLE_NAME, new String[] { ModuleDB.ID,
ModuleDB.MODULE}, null, null, null, null, null);
while (c.moveToNext()) {
Module m = new Module(c.getInt(0), c.getString(1));
result.add(m);
}
c.close();
db.close();
return result;
}
// Update Database entry
public static void update(Context ctx, Module m) {
DatabaseHelper helper = new DatabaseHelper(ctx);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("_id", m.get_id());
values.put("name", m.getModule());
db.update("module", values, null, null);
db.close();
}
public static void delete(Context ctx, Module m) {
DatabaseHelper helper = new DatabaseHelper(ctx);
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("_id", m.get_id());
values.put("name", m.getModule());
db.delete("module","_id = m.get_id()", null);
db.close();
}
public static void createDB(Context ctx) {
DatabaseHelper helper = new DatabaseHelper(ctx);
SQLiteDatabase db = helper.getWritableDatabase();
db.close();
}
}
Для повышения эффективности используются методы static
, вам не нужно создавать объекты.
Используйте это так: В своей деятельности
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// get the a writable DB, in case it's not existing it gets created.
DataHandlerDB.createDB(this);
// get stuff out of DB
moduleList = DataHandlerDB.findAll(this);
adapter = new ArrayAdapter<Module>(this,
android.R.layout.simple_list_item_1, moduleList);
setListAdapter(adapter);
}