Versuch zur Wiedereröffnung einer bereits geschlossenen sqlitedatabase-Objekt
Ich habe einen databaseHandler. Ich brauche die Anzahl der Zeilen in der Tabelle. App stürzt ab, durch die dieser Fehler: android attempt to reopen an already-closed object sqlitedatabase
.
Ich verwende einfach diesen code in Tätigkeit:
db.getContactsCount();
Aber app stürzt ab. Außerdem will ich zurücksetzen der Tabellen (Tabelle löschen von Zeilen). Ich fügte hinzu, die folgende Methode:
public void deleteTable() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete("contacts", null, null);
}
Es funktioniert gut, aber ich kann nicht, verwenden Sie diese ein:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
// Create tables again
onCreate(db);
}
Dies ist der databasehandler:
public class DatabaseHandler extends SQLiteOpenHelper {
// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "contactsManager";
// Contacts table name
private static final String TABLE_CONTACTS = "contacts";
// Contacts Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_PH_NO = "phone_number";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NO + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
// Upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
// Create tables again
onCreate(db);
}
/**
* All CRUD(Create, Read, Update, Delete) Operations
*/
// Adding new contact
void addContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName()); // Contact Name
values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
db.close(); // Closing database connection
}
// Getting single contact
Contact getContact(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2));
// return contact
return contact;
}
// Getting All Contacts
public List<Contact> getAllContacts() {
List<Contact> contactList = new ArrayList<Contact>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_CONTACTS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Contact contact = new Contact();
contact.setID(Integer.parseInt(cursor.getString(0)));
contact.setName(cursor.getString(1));
contact.setPhoneNumber(cursor.getString(2));
// Adding contact to list
contactList.add(contact);
} while (cursor.moveToNext());
}
// return contact list
return contactList;
}
// Updating single contact
public int updateContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber());
// updating row
return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
new String[] { String.valueOf(contact.getID()) });
}
// Deleting single contact
public void deleteContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
new String[] { String.valueOf(contact.getID()) });
db.close();
}
// Getting contacts Count
public int getContactsCount() {
String countQuery = "SELECT * FROM " + TABLE_CONTACTS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
public void Upgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_PH_NO + " TEXT" + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
// Deleting single contact
public void deleteTable() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete("contacts", null, null);
}
}
- Einfach öffnen Sie es, indem Sie die Linie etwas namens myDb.open(). Dann machen Sie Ihre Arbeit.
- Hola.
myDb.open()
wird die Datenbank Aktualisieren? löschen von Zeilen der Tabelle ,...?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschieht es wegen der:
db.close();
in den Methoden:
void addContact(Contact contact)
public void deleteContact(Contact contact)
Sollten Sie nicht schließen Sie die Verbindung zu der zugrunde liegenden Datenbank, es sei denn, Sie wirklich nicht beabsichtigen, mit zu arbeiten es nicht mehr.
Verwenden
SQLiteOpenHelper:close
, wenn Sie fertig sind Ihre Arbeit.Fordert außerdem zu
getReadableDatabase()
undgetWriteableDatabase()
wieder den gleichen Datenbank-Objekt 99% der Zeit, und Sie nicht initialisieren der Datenbank-Verbindung manuell geschlossen, indem Sie.Sollte sich nicht täuschen lassen durch diese Methode Namen.
Ich würde gerne vorschlagen, dass Sie, die dont close Datenbank-Objekt, bevor Sie vollständig Ihre Datenbank-Arbeit.
Oben beide Verfahren geben uns die Datenbank-Objekt mit helper-Klasse und verwenden dieses Objekt, das wir tun können verschiedene Aktionen auf der Datenbank. Aber in deinem Szenario, denke ich, so dass Sie geschlossen Datenbank-Objekt, bevor Sie vollständige Datenbank-Betrieb. So geschlossen, nachdem alle gemacht-operation mithilfe
Die onUpgrade ist, wenn Sie änderungen an Ihrer Datenbank (dh das hinzufügen von Tabellen), so gibt es jetzt eine neue version Ihrer Datenbank. Ihre:
ist jetzt
Da die version der Datenbank ist jetzt höher neuere version der OnUpgrade () - Methode aufgerufen, und die Datenbank aktualisiert.
es im Grunde geschieht, weil der cursor.close();
da schließen Sie die cursor-Objekt aus, bevor Sie wieder seinen count.
Ich soll definiert haben
int count = cursor.getCount();
vor dem schließen der Datenbank. Es scheintreturn cursor.getCount();
nach dem schließen der Datenbank ist eine nutzlose Anstrengung.Endlich entfernen
db.close();
am Ende von löschen und entfernen-Methoden notwendig.Das hinzufügen dieser code statt im handler statt viel geholfen:
Manipulation
close
Funktion innerhalb Aktivität am Ende der Datenbank-Auslastung war besser. Danke an @Drew.Ich kann immer noch nicht verstehen, die Verwendung von
onUpgrade
innen hf ???