2013-01-15 196 views
0

我的应用程序会将数据库中的所有信息显示到列表视图中。当我点击列表视图中的一行时,应用程序会通知你想从数据库中删除它?但错误是当我点击确定,应用程序通知错误。我不明白为什么错误不能打开databse。 源代码无法删除sqlite中的记录

public class Index extends Activity { 

private ArrayList<String> DateArray = new ArrayList<String>(); 
    private ArrayList<String> CostArray = new ArrayList<String>(); 
    private ArrayList<String> SalesArray = new ArrayList<String>(); 
    private ArrayList<String> ProfitArray = new ArrayList<String>(); 
    private ArrayList<String> IDArray = new ArrayList<String>(); 
    private DB_Adapter mDb = new DB_Adapter(this); 
    ListView listview; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.index); 
    listview = (ListView) ((Activity) this) 
      .findViewById(R.id.listView1); 
    workoffline(); 
} 

@Override 
protected void onRestart() { 
    // TODO Auto-generated method stub 
    workoffline(); 
    super.onRestart(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    workoffline(); 
    super.onResume(); 
} 

public void clearArray() 
    { 
     DateArray.clear(); 
     CostArray.clear(); 
     SalesArray.clear(); 
     ProfitArray.clear(); 
     IDArray.clear(); 
    } 

public void workoffline() 
{ 
    clearArray(); 
    try { 
     // mở kết nối đến databse sqlite 
     mDb.openDB(); 
     // lấy thông tin thông qua IDDelivery 
     Cursor mCursor = mDb.getAll(); 
     // Duyệt record từ đầu 
     if (mCursor.moveToFirst()) { 
      do { 
       IDArray.add(mCursor.getString(0)); 
       DateArray.add(mCursor.getString(1)); 
       CostArray.add(mCursor.getString(2)); 
       SalesArray.add(mCursor.getString(3)); 
       ProfitArray.add(mCursor.getString(4)); 

      } while (mCursor.moveToNext()); 
      listview.setAdapter(new DataAdapter(this, DateArray 
        .toArray(new String[DateArray.size()]), CostArray 
        .toArray(new String[CostArray.size()]), SalesArray 
        .toArray(new String[SalesArray.size()]), ProfitArray 
        .toArray(new String[ProfitArray.size()]))); 
      listview.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
        final int ID = Integer.valueOf(IDArray.get(position)); 
         try { 

          Index.this.runOnUiThread(new Runnable() { 
           public void run() { 

            AlertDialog.Builder builder = new AlertDialog.Builder(
              Index.this); 
            builder.setTitle("Waring!"); 
            builder.setMessage("Are you delete!") 
              .setCancelable(false) 
              .setPositiveButton("Ok", 
                new DialogInterface.OnClickListener() { 
                 public void onClick(
                   DialogInterface dialog, int id) { 
                   mDb.delete_byID(ID); 
                 } 
                }); 
            builder.setNegativeButton("Không", new DialogInterface.OnClickListener() { 
             @Override 
             public void onClick(DialogInterface dialog, int which) { 

             } 
            }); 
            AlertDialog alert = builder.create(); 
            alert.show(); 
           } 
          }); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
      }); 

     } 
     // Đóng database 
     mDb.closeDB(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
} 

日志猫错误

01-15 16:06:50.940: E/AndroidRuntime(17932): FATAL EXCEPTION: main 
01-15 16:06:50.940: E/AndroidRuntime(17932): java.lang.IllegalStateException: database not open 
01-15 16:06:50.940: E/AndroidRuntime(17932): at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1619) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at Data.DB_Adapter.delete_byID(DB_Adapter.java:94) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at com.example.xitinshop.Index$1$1$1.onClick(Index.java:102) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:159) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at android.os.Looper.loop(Looper.java:130) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at android.app.ActivityThread.main(ActivityThread.java:3683) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at java.lang.reflect.Method.invokeNative(Native Method) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at java.lang.reflect.Method.invoke(Method.java:507) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
-15 16:06:50.940: E/AndroidRuntime(17932):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-15 16:06:50.940: E/AndroidRuntime(17932): at dalvik.system.NativeStart.main(Native Method) 
+0

onItemClick是uithread,你不需要 – njzk2

+0

你关闭分贝runonuithread那里调用,然后你点击的项目。这就是为什么数据库没有打开。 – njzk2

+0

close db after line'mDb.delete_byID(ID);' – Deepzz

回答

0

尝试打开和关闭按钮,点击在数据库中,这样的事情:

.setPositiveButton("Ok", 
    new DialogInterface.OnClickListener() { 
     public void onClick(
       DialogInterface dialog, int id) { 
       mDB.openDB(); 
       mDb.delete_byID(ID); 
       myDB.closeDB(); 
     } 
    }); 
0

您打开数据库,查询数据,然后再关闭DB。之后会执行onClick方法,所以当时DB已经关闭。

0

它总是一个更好的做法,打开和关闭SQLiteOpenHelper类中的数据库。

一样,

public class FriendsDatatbaseHelper extends SQLiteOpenHelper { 
public int deleteContact(String contact_id) { 
    db = getWritableDatabase(); 
    int delete = db.delete(FRIENDS_TABLE_NAME, "contact_index=" + contact_id, null); 
    db = getWritableDatabase(); 
    return delete; 
} 
}