2013-01-15 3 views
0

내 응용 프로그램은 데이터베이스의 모든 정보를 listview에 표시합니다. 리스트 뷰에서 한 행을 클릭하면 애플리케이션이 데이터베이스에서 해당 행을 삭제하겠다고 알립니다. 하지만 오류는 내가 확인을 클릭하면, 응용 프로그램 통지 오류입니다. 나는 왜 오류가 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

, 당신은 당신이 DB를 닫습니다 – njzk2

+0

runonuithread이 호출 할 필요는 없습니다, 다음은 항목을 클릭합니다. 그래서 db가 열리지 않습니다. – njzk2

+0

'mDb.delete_byID (ID); 행 뒤의 db를 닫습니다. – Deepzz

답변

0

보십시오 개방하고 버튼을 클릭 내에서 데이터베이스,이 같은 폐쇄 : 당신은 DB를 열

.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 클래스에서 db를 열고 닫는 것이 더 좋습니다. onItemClick이 uithread에

같은

,

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; 
} 
} 
관련 문제