Android SQLite: tentative de re-ouvrir un objet fermé
Je vais essayer d'obtenir certaines données sur le livre de ma table d'Inventaire basé sur l'ISBN.
Cependant, j'obtiens une erreur: "tentative de ré-ouvrir un objet fermé". L'erreur se produit uniquement lorsque je clique sur une liste d'objet, d'aller à un autre écran, allez à cette page via "finish()", puis cliquez sur un autre objet listView. J'ai déplacé le String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);
de la onClickListener
à la précédente pour la boucle avant la onClickListener
et maintenant ça fonctionne.
Pourquoi cela ne fonctionne pas, si j'essaie de getInventoryEntriesByISBN après le retour de cette activité à partir d'une autre activité par l'intermédiaire de "finish()"?
L'erreur se produit au SearchResultsScreen:
String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);
et, par extension, se produit à InventoryAdapter:
Cursor cursor = db.rawQuery(query, new String[] {ISBN});
SearchResultsScreen.java
//Set up search array
for(int i = 0; i < isbn.length; i++)
{
searchArray.add(new InventoryItem(isbn[i], InventoryAdapter.getTitleAndAuthorByISBN(isbn[i])));
}
Toast.makeText(getApplicationContext(), "searchArray.size()="+searchArray.size(), Toast.LENGTH_LONG).show();
//add data in custom adapter
adapter = new CustomAdapter(this, R.layout.list, searchArray);
ListView dataList = (ListView) findViewById(R.id.list);
dataList.setAdapter(adapter);
//On Click ========================================================
dataList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);
InventoryAdapter.java (la Plupart des parties pertinentes)
public String[] getInventoryEntriesByISBN(String search, String ISBN)
{
String[] searchEntry = new String [9];
//Query
String query = "select * from INVENTORY where ISBN = ?";
Cursor cursor = db.rawQuery(query, new String[] {ISBN});
if(cursor.getCount()<1) //title Not Exist
{
cursor.close();
for(int i = 0; i < 9; i++)
searchEntry[i] = "Not Found";
return searchEntry;
}
cursor.moveToFirst();
//put data into respective variable
int publish = cursor.getInt(cursor.getColumnIndex("PUBLISH_DATE"));
String publishdate = ((Integer)publish).toString();
String title = cursor.getString(cursor.getColumnIndex("TITLE"));
String author = cursor.getString(cursor.getColumnIndex("AUTHOR"));
String callNumber = cursor.getString(cursor.getColumnIndex("CALL_NUMBER"));
int available = cursor.getInt(cursor.getColumnIndex("AVAILABLE_COUNT"));
String availablecount = ((Integer)available).toString();
int inventory = cursor.getInt(cursor.getColumnIndex("INVENTORY_COUNT"));
String inventorycount = ((Integer)inventory).toString();
int due = cursor.getInt(cursor.getColumnIndex("DUE_PERIOD"));
String dueperiod = ((Integer)due).toString();
int checkoutcount = cursor.getInt(cursor.getColumnIndex("COUNT"));
String count = ((Integer)checkoutcount).toString();
//combine variables into one array
searchEntry[0] = ISBN;
searchEntry[1] = title;
searchEntry[2] = author;
searchEntry[3] = publishdate;
searchEntry[4] = callNumber;
searchEntry[5] = availablecount;
searchEntry[6] = inventorycount;
searchEntry[7] = dueperiod;
searchEntry[8] = count;
cursor.close();
return searchEntry;
}
public String getTitleAndAuthorByISBN(String ISBN)
{
int entriesFound = getNumSearchEntries(ISBN);
if(entriesFound==0)
entriesFound = 1;
String searchEntry;
//Query
String query = "select * from INVENTORY where ISBN = ?";
Cursor cursor = db.rawQuery(query, new String[] {ISBN});
if(cursor.getCount()<1) //title Not Exist
{
cursor.close();
searchEntry = "Not Found";
return searchEntry;
}
cursor.moveToFirst();
//put data into respective variable
String title = cursor.getString(cursor.getColumnIndex("TITLE"));
String author = cursor.getString(cursor.getColumnIndex("AUTHOR"));
//combine variables into one String
searchEntry = title + " /" + author;
//close cursor and return
cursor.close();
return searchEntry;
}
DataBaseHelper.java
public class DataBaseHelper extends SQLiteOpenHelper
{
//Database Version
private static final int DATABASE_VERSION = 1;
//Database Name
private static final String DATABASE_NAME = "database.db";
//============================ End Variables ===========================
public DataBaseHelper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
}
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//Called when no database exists in disk and the helper class needs
//to create a new one.
@Override
public void onCreate(SQLiteDatabase _db)
{
_db.execSQL(LoginDataBaseAdapter.USER_TABLE_CREATE);
_db.execSQL(CheckOutDataBaseAdapter.CHECKOUT_TABLE_CREATE);
_db.execSQL(InventoryAdapter.INVENTORY_TABLE_CREATE);
_db.execSQL(StatisticsAdapter.STATISTICS_TABLE_CREATE);
}
//Called when there is a database version mismatch meaning that the version
//of the database on disk needs to be upgraded to the current version.
@Override
public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion)
{
//Log the version upgrade.
Log.w("TaskDBAdapter", "Upgrading from version " +_oldVersion + " to " +_newVersion + ", which will destroy all old data");
//Upgrade the existing database to conform to the new version. Multiple
//previous versions can be handled by comparing _oldVersion and _newVersion
//values.
//on upgrade drop older tables
_db.execSQL("DROP TABLE IF EXISTS " + LoginDataBaseAdapter.USER_TABLE_CREATE);
_db.execSQL("DROP TABLE IF EXISTS " + CheckOutDataBaseAdapter.CHECKOUT_TABLE_CREATE);
_db.execSQL("DROP TABLE IF EXISTS " + InventoryAdapter.INVENTORY_TABLE_CREATE);
_db.execSQL("DROP TABLE IF EXISTS " + StatisticsAdapter.STATISTICS_TABLE_CREATE);
//Create a new one.
onCreate(_db);
}
}
J'ai édité la question d'inclure la base de données de la classe.
post adaptateur code aussi. l'erreur est clair vous êtes à la fermeture du curseur et de supprimer ce
onCreate(_db);
pouvez-vous montrer
InventoryAdapter.INVENTORY_TABLE_CREATE
?Il s'avère que l'erreur ne se produit que lorsque je clique sur un élément, d'aller à un autre écran, allez à cette page via "finish()", puis cliquez sur un autre objet listView. J'ai déplacé le
String searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(searchQuery, isbn[position]);
de la onClickListener à la précédente pour la boucle avant de la onClickListener et maintenant ça fonctionne. Pourquoi est-ce?
OriginalL'auteur erad | 2014-01-11
Vous devez vous connecter pour publier un commentaire.
Vérifier la Connexion de Base de données avant l'exécution de la requête:
if (!dbHelper.db.isOpen())
dbHelper.open();
vous pouvez également utiliser
cursor.requery();
de nouveau la même requête.et dans la dernière, vous devez fermer le curseur et la base de données.
Édité:
J'ai créé
DBHelper
classe qui s'étendSQLiteOpenHelper
, cette classe est intérieure de la classe deDatabaseHelper
de la classe et de la classe ont des méthodes suivantes.Si vous avez encore des doutes, alors n'hésitez pas à me ping. Merci.
open()
méthode, où vous vient-il?Mon
open
etclose
méthode de faire il suffit d'Ouvrir et de Fermer la Base de données. ainsi, vous pouvez écrire directement à votre instance db,Je suis désolé mais je ne comprends toujours pas.. j'ai 3 cas
MyDbHelper dbHelper = new MyDbHelper(); SQLiteDatabase dbr = dbHelper.getReadableDatabase(), dbw = dbHelper.getWriteableDatabase();
et aucun d'entre eux ont unopen()
méthode, mais chacun d'entre eux ont unclose()
méthode... Désolé si je vous dérange mais je suis nouveau sur Android et j'ai rencontré ce problème...maintenant j'ai résolu en laissant ouverte (pas de fermeture) de l'aide et le Curseur dans lafinally
bloc de latry-catch-finally
mais je crois que ce n'est pas la solution début le SDK levée d'une exceptionDatabaseObjectNotClosedException
J'ai édité ma réponse s'il vous plaît vérifier.
Ok, maintenant je comprends! Ainsi, "l'ouverture d'une base de données" signifie juste istantiate une nouvelle
SQLiteOpenHelper
et appeler l'un degetWritable/ReadableDatabase()
méthodes...maintenant que j'ai lu de mieux Adroid docs sur ces méthodes unis "Créer et/ou ouvrir une base de données" je vous Remercie beaucoup pour votre temps!!OriginalL'auteur Pratik Butani AndroidDev
L'erreur se produit uniquement lorsque je clique sur un élément, d'aller à un autre écran, allez à cette page via "finish()", puis cliquez sur un autre objet listView.
J'ai déplacé la Chaîne searchEntries[] = InventoryAdapter.getInventoryEntriesByISBN(a, isbn[position]); à partir de la onClickListener à la précédente pour la boucle avant de la onClickListener et maintenant ça fonctionne.
Le bon SearchResultsScreen est ci-dessous:
SearchResultsScreen.java
searchEntry
retourne pas trouvé si count est <1 si count >1 que faut-il de retour?J'ai édité la question afin de montrer au reste du code, qui devient simplement les données de la table et la stocke dans le tableau. Il fonctionne très bien pour moi.
hmm.. il semble bien maintenant.
Ce n'est pas une solution, vous avez besoin d'un synchronisé !!!, ou vous pouvez obtenir dans un avenir le même message d'erreur
OriginalL'auteur erad
C'est votre problème
Changement de
OriginalL'auteur Raghunandan
Ajouter
SQLiteDatabase db = this.getWritableDatabase();
dans le présent code avant l'exécution de la crue de Requêtevotre problème est que vous fermez le curseur, puis faire l'opération. vérifier mon post
Utiliser un
Context
et ensuite utiliser. Ou essayez avecgetActivity().getWritableDatabse
OriginalL'auteur PsyGik