Java 如何真正关闭数据\数据\数据库?
当我第一次打开应用程序时,我没有收到任何错误。当我关闭应用程序,然后再次运行时,不会显示任何错误,但不会强制关闭。错误:从未对数据库“/data/data/com.Story.Story/databases/Story”显式调用close。注:Story=dastan 数据库适配器类`公共类数据库适配器{Java 如何真正关闭数据\数据\数据库?,java,android,arrays,Java,Android,Arrays,当我第一次打开应用程序时,我没有收到任何错误。当我关闭应用程序,然后再次运行时,不会显示任何错误,但不会强制关闭。错误:从未对数据库“/data/data/com.Story.Story/databases/Story”显式调用close。注:Story=dastan 数据库适配器类`公共类数据库适配器{ public static final String KEY_ID = "id"; public static final String KEY_ONVAN = "onvan"; public
public static final String KEY_ID = "id";
public static final String KEY_ONVAN = "onvan";
public static final String KEY_MATN = "matn";
public static final String KEY_IMG = "tasvir";
public static final String KEY_FAV = "fav";
public static final String KEY_JALEB = "jaleb";
public static final String KEY_EXTRA = "ezafi";
public static final String DATABASE_NAME = "dastanha";
public static final String DATABASE_TABLE = "dastanha";
public static final String TAG = "FullBook Esfandune";
//static final String CREATE_TABLE
static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "
+ DATABASE_TABLE + " (" + KEY_ID
+ " INTEGER PRIMARY KEY NOT NULL , " + KEY_ONVAN + " TEXT, "
+ KEY_MATN + " TEXT, " + KEY_IMG
+ " TEXT, " + KEY_FAV + " INTEGER NOT NULL DEFAULT 0, "
+ KEY_JALEB + " INTEGER NOT NULL DEFAULT 0, " + KEY_EXTRA
+ " TEXT)";
String[] yek_name = new String []{ KEY_ID, KEY_ONVAN,
KEY_MATN, KEY_IMG, KEY_FAV, KEY_JALEB, KEY_EXTRA
};
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
//DATABASE_VERSION = 1
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + "
to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---retrieves all the contacts---
public List<Dastan> getAllContacts()
{
db = DBHelper.getReadableDatabase();
Cursor cursor = db.query(DATABASE_TABLE, yek_name, null, null, null,
null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
private List<Dastan> cursorToList(Cursor cursor) {
db = DBHelper.getReadableDatabase();
List<Dastan> nams = new ArrayList<Dastan>();
if (cursor.getCount() > 0)
{
while (cursor.moveToNext()) {
Dastan nam = new Dastan();
nam.setId(cursor.getInt(cursor.getColumnIndex(KEY_ID)));
nam.setOnvan(cursor.getString(cursor.getColumnIndex(KEY_ONVAN)));
nam.setMatn(cursor.getString(cursor.getColumnIndex(KEY_MATN)));
nam.setTasvir(cursor.getString(cursor.getColumnIndex(KEY_IMG)));
nam.setFav(cursor.getInt(cursor.getColumnIndex(KEY_FAV)));
nam.setJaleb(cursor.getInt(cursor.getColumnIndex(KEY_JALEB)));
nam.setEzafi(cursor.getString(cursor.getColumnIndex(KEY_EXTRA)));
nams.add(nam);
} ;
}
cursor.close();
return nams;
}
public Dastan getContact(int new_id) throws SQLException {
db = DBHelper.getReadableDatabase();
List<Dastan> nams = new ArrayList<Dastan>();
Cursor cursor =db.query(true, DATABASE_TABLE, yek_name, KEY_ID
+ " == '" + new_id + "'", null,
null, null, null, null);
Dastan nam = new Dastan();
if (cursor != null) {
cursor.moveToFirst();
//***
nams = cursorToList(cursor);
}
Log.i(TAG, nam.getOnvan() + ",database");
return nams.get(0);
}
public List<Dastan> findContacts(String nam,String row) throws
SQLException {
db = DBHelper.getReadableDatabase();
Cursor cursor = db.query(true, DATABASE_TABLE, yek_name, row
+ " LIKE '%" + nam + "%'", null,
null, null, null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
public List<Dastan> findFAVContacts() throws SQLException
{db = DBHelper.getReadableDatabase();
Cursor cursor =db.query(true, DATABASE_TABLE, yek_name, KEY_FAV + "
== " + 1 + "", null,
null, null, null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
public List<Dastan> findKhandeContacts() throws SQLException {
Cursor cursor =db.query(true, DATABASE_TABLE, yek_name, KEY_JALEB +
" == " + 1 + "", null,
null, null, null, null);
List<Dastan> nams = cursorToList(cursor);
return nams;
}
//---updates a contact---
public boolean updateContact(Dastan up_nam) {
ContentValues args = new ContentValues();
args.put(KEY_ID, up_nam.getId());
args.put(KEY_ONVAN, up_nam.getOnvan());
args.put(KEY_MATN, up_nam.getMatn());
args.put(KEY_IMG, up_nam.getTasvir());
args.put(KEY_FAV, up_nam.getFav());
args.put(KEY_JALEB, up_nam.getJaleb());
args.put(KEY_EXTRA, up_nam.getEzafi());
return db.update(DATABASE_TABLE, args, KEY_ID + "=" +
up_nam.getId(), null) > 0;
}
public int dbSetFav(int id, int newValue) {
db = DBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_FAV, newValue);
// updating row
return db.update(DATABASE_TABLE, values, KEY_ID + "=?", new String[]
{ String.valueOf(id) });
}
}
大宗报价
大宗报价
错误日志cat`09-06 07:46:31.377:E/Database4768:close已关闭
从未对数据库“/data/data/ir.GiyaHan.GiyaHan”显式调用
/数据库/dastanha'
您在DatabaseHelper类中定义了一个close方法,该方法将关闭数据库,但据我所知,您的代码中没有任何东西调用它。除非您的应用程序导致在适当的点调用该方法,否则数据库将不会关闭
and main activity call data\data
` @SuppressLint("ClickableViewAccessibility") public class
MainActivity extends ListActivity {
Context c;
DBAdapter db;
List<Dastan> dastanha;
Dastan dastan;
ListView lst;
boolean isAll;
Bitmap bitmap;
Intent intent;
Inventory inventory;
Button blueButton;
LinearLayout myLO;
public static final String SKU_PREMIUM = "ML";
public boolean mIsPremium = false;
public static Handler handler = new Handler();
// private IabHelper iabHelper;
@SuppressLint("SdCardPath") @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.root);
final IabHelper.QueryInventoryFinishedListener
onQueryInventoryFinished=newIabHelper.QueryInventoryFinishedListener()
{
public void onQueryInventoryFinished(IabResult result,
Inventory inventory) {
Log.d(HelperIAP.TAG, "Query inventory finished.");
if (result.isFailure()) {
Log.d(HelperIAP.TAG, "Failed to query inventory: " +
result);
return;
}
else {
Log.d(HelperIAP.TAG, "Query inventory was successful.");
// does the user have the premium upgrade?
mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
// update UI accordingly
Log.d(HelperIAP.TAG, "User is " + (mIsPremium ?
"PREMIUM" : "NOT PREMIUM"));
}
Log.d(HelperIAP.TAG, "Initial inventory query finished;
enabling main UI.");
return;
}
};
HelperIAP.isUserPermium(this, onQueryInventoryFinished);
final IabHelper.OnIabPurchaseFinishedListener onIabPurchaseFinished
= new OnIabPurchaseFinishedListener() {
@Override
public void onIabPurchaseFinished(IabResult result, Purchase
purchase) {
// TODO Auto-generated method stub
if (result.isFailure()) {
Log.d(HelperIAP.TAG, "پرداخت انجام نشد: " + result);
return;
}
else if (purchase.getSku().equals(SKU_PREMIUM)) {
Toast.makeText(MainActivity.this, "نسخه طلایی فعال شد
", Toast.LENGTH_SHORT).show();
mIsPremium = true;
}
}
};
Button btnPurchaseML = (Button) findViewById(R.id.btnPurchaseMl);
btnPurchaseML.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//iabHelper = HelperIAP.iapInitalizer(MainActivity.this);
if(HelperIAP.helperIAPIsSetup){
HelperIAP.iabHelper.launchPurchaseFlow(MainActivity.this,
SKU_PREMIUM, 0, onIabPurchaseFinished, "payload-string");
}
}
});
Button btn_josteju = (Button) findViewById(R.id.main_josteju);
Button btn_all = (Button) findViewById(R.id.main_all);
Button btn_fav = (Button) findViewById(R.id.main_fav);
// Button btn_about = (Button) findViewById(R.id.main_about);
ImageButton btn_sett = (ImageButton)
findViewById(R.id.main_setting);
//final Button btn_big = (Button) findViewById(R.id.main_big);
Button all = (Button) findViewById(R.id.hame);
Button alagheh = (Button) findViewById(R.id.alagheh);
Button jost = (Button) findViewById(R.id.jost);
Button darbareh = (Button) findViewById(R.id.darbareh);
Button khorog = (Button) this.findViewById(R.id.khoroj);
Button tan = (Button) findViewById(R.id.tanzim);
Button ya = (Button) findViewById(R.id.yad);
Button yad = (Button) findViewById(R.id.yadasht);
Button nz = (Button) findViewById(R.id.nazar);
isAll = true;
lst = getListView();
db = new DBAdapter(getBaseContext());
db.open();
c = getBaseContext();
Log.i(DBAdapter.TAG,"3");
dastanha = db.getAllContacts();
Log.i(DBAdapter.TAG,"4");
if (dastanha.size() == 0){
String destPath = "/data/data/" + getPackageName()
+ "/databases";
try {
//CopyDB(getBaseContext().getAssets().open("mydb"),
//new FileOutputStream(destpath+"/dastanha"));
copyDataBase(getBaseContext(), new
FileOutputStream(destPath+"/dastanha"));
Log.i(DBAdapter.TAG ,"db copy shod");
dastanha = db.getAllContacts();
RefreshDisplay();
Log.i(DBAdapter.TAG, dastanha.size() + "= tedad dastanha");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
RefreshDisplay();
}
protected void onListItemClick(ListView l, View v, int position,
long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
if(position>10 && mIsPremium != true){
Toast.makeText(getApplicationContext(),"
برای استفاده از این موضوع باید خرید کنید
",Toast.LENGTH_SHORT).show();
}else if(position>10 && mIsPremium || true){
Dastan dastan = dastanha.get(position);
Intent next = new Intent(this, ShowDastan.class);
next.putExtra("thisdastan", dastan);
startActivity(next);
}
}
/*@Override
protected void onListItemClick(ListView l, View v, int position,
long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Dastan dastan = dastanha.get(position);
Intent next = new Intent(this, ShowDastan.class);
next.putExtra("thisdastan", dastan);
startActivity(next);
}*/
private static void copyDataBase(Context ctx, FileOutputStream os)
throws IOException {
AssetManager am = ctx.getAssets();
byte[] b = new byte[1024];
int r;
for (int i = 1; i <= 6; i++) {
InputStream is = am.open("mydb.sqlite.00" + i);
while ((r = is.read(b)) != -1) {
os.write(b, 0, r);
}
is.close();
}
os.close();
}
public void RefreshDisplay(){
Log.i(DBAdapter.TAG, dastanha.size() + "=tedad dastanha");
ArrayAdapter<Dastan> adapter = new DastanAdapter(this, dastanha);
//save scroll
Parcelable state = lst.onSaveInstanceState();
setListAdapter(adapter);
lst.onRestoreInstanceState(state);
//save scroll
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("تایید خروج")
.setMessage("میخواهید از برنامه خارج شوید")
.setPositiveButton("بله", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Stop the activity
MainActivity.this.finish();
}
})
.setNegativeButton("خیر", null)
.show();
//Intent intent = new Intent(Intent.ACTION_EDIT);
//intent.setData(Uri.parse("bazaar://details?id=" +
"ir.GiyaHan.giyahan"));
// intent.setPackage("com.farsitel.bazaar");
///startActivity(intent);
return true;
} else
return super.onKeyDown(keyCode, event);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (isAll) {
dastanha = db.getAllContacts();
}else {
dastanha =db.findFAVContacts();
}
RefreshDisplay();
//Log.i(DBAdapter.TAG, "ok");
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(HelperIAP.TAG, "onActivityResult(" + requestCode + "," +
resultCode + "," + data);
if (!HelperIAP.iabHelper.handleActivityResult(requestCode,
resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
} else {
Log.d(HelperIAP.TAG, "onActivityResult handled by IABUtil.");
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (HelperIAP.iabHelper != null) {
HelperIAP.iabHelper.dispose();
}
HelperIAP.iabHelper = null;
}
}`
09-06 07:46:31.377: E/Database(4768):
android.database.sqlite.DatabaseObjectNotClosedException:
Application
did not close the cursor or database object that was opened here
09-06 07:46:31.377: E/Database(4768):at
android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
09-06 07:46:31.377: E/Database(4768): at
android.database.sqlite.SQLiteDatabase.openDatabase
(SQLiteDatabase.java:817)
09-06 07:46:31.377: E/Database(4768): at
android.database.sqlite.SQLiteDatabase.openOrCreateDatabase
(SQLiteDatabase.java:851)
09-06 07:46:31.377: E/Database(4768): at
android.database.sqlite.SQLiteDatabase.openOrCreateDatabase
(SQLiteDatabase.java:844)
09-06 07:46:31.377: E/Database(4768): at
android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
09-06 07:46:31.377: E/Database(4768): at
android.database.sqlite.SQLiteOpenHelper.getWritableDatabase
(SQLiteOpenHelper.java:98)
09-06 07:46:31.377: E/Database(4768): at
ir.GiyaHan.database.DBAdapter.open(DBAdapter.java:110)
09-06 07:46:31.377: E/Database(4768): at
ir.GiyaHan.giyahan.MainActivity.onCreate(MainActivity.java:174)
09-06 07:46:31.377: E/Database(4768): at
android.app.Instrumentation.callActivityOnCreate
(Instrumentation.java:1047)
09-06 07:46:31.377: E/Database(4768): at
android.app.ActivityThread.performLaunchActivity
(ActivityThread.java:2627)
09-06 07:46:31.377: E/Database(4768): at
android.app.ActivityThread.handleLaunchActivity
(ActivityThread.java:2679)
09-06 07:46:31.377: E/Database(4768): at
android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-06 07:46:31.377: E/Database(4768): at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-06 07:46:31.377: E/Database(4768): at
android.os.Handler.dispatchMessage(Handler.java:99)
09-06 07:46:31.377: E/Database(4768): at
android.os.Looper.loop(Looper.java:123)
09-06 07:46:31.377: E/Database(4768): at
android.app.ActivityThread.main(ActivityThread.java:4627)
09-06 07:46:31.377: E/Database(4768): at
java.lang.reflect.Method.invokeNative(Native Method)
09-06 07:46:31.377: E/Database(4768): at
java.lang.reflect.Method.invoke(Method.java:521)
09-06 07:46:31.377: E/Database(4768): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:868)
09-06 07:46:31.377: E/Database(4768): at
com.android.internal.os.ZygoteInit.main(
ZygoteInit.java:626)
E/Database(4768): at dalvik.system.NativeStart.main(Native Method)
`