Java 如何真正关闭数据\数据\数据库?

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

当我第一次打开应用程序时,我没有收到任何错误。当我关闭应用程序,然后再次运行时,不会显示任何错误,但不会强制关闭。错误:从未对数据库“/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 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)
  `