2014-01-06 1 views
0

작업이라는 또 다른 활동을 시작할 때 오류 메시지가 나타납니다. . 응용 프로그램은 4 개 이미지 버튼이 (다른 버튼 이미지가 열려 제대로 나는 "TaskViewer"(ImageButton2)를 클릭하면 오류가 나타납니다불행히도 Organitza't (내 앱)가 중지되었습니다

열려고 활동 :. (ViewTask)

public class ViewTask extends Activity { 
protected TaskerDbHelper db; 
List<Task> list; 
MyAdapter adapt; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_view_task); 
    db = new TaskerDbHelper(this); 
    list = db.getAllTasks(); 
    adapt = new MyAdapter(this, R.layout.list_inner_view, list); 
    ListView listTask = (ListView) findViewById(R.id.listView1); 
    listTask.setAdapter(adapt); 
} 

public void addTaskNow(View v) { 
    EditText t = (EditText) findViewById(R.id.editText1); 
    String s = t.getText().toString(); 
    if (s.equalsIgnoreCase("")) { 
     Toast.makeText(this, "enter the task description first!!", 
       Toast.LENGTH_LONG); 
    } else { 
     Task task = new Task(s, 0); 
     db.addTask(task); 
     Log.d("tasker", "data added"); 
     t.setText(""); 
     adapt.add(task); 
     adapt.notifyDataSetChanged(); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_view_task, menu); 
    return true; 
} 

private class MyAdapter extends ArrayAdapter<Task> { 

    Context context; 
    List<Task> taskList = new ArrayList<Task>(); 
    int layoutResourceId; 

    public MyAdapter(Context context, int layoutResourceId, 
      List<Task> objects) { 
     super(context, layoutResourceId, objects); 
     this.layoutResourceId = layoutResourceId; 
     this.taskList = objects; 
     this.context = context; 
    } 

    /** 
    * This method will DEFINe what the view inside the list view will 
    * finally look like Here we are going to code that the checkbox state 
    * is the status of task and check box text is the task name 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     CheckBox chk = null; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.list_inner_view, 
        parent, false); 
      chk = (CheckBox) convertView.findViewById(R.id.chkStatus); 
      convertView.setTag(chk); 

      chk.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        CheckBox cb = (CheckBox) v; 
        Task changeTask = (Task) cb.getTag(); 
        changeTask.setStatus(cb.isChecked() == true ? 1 : 0); 
        db.updateTask(changeTask); 
        Toast.makeText(
          getApplicationContext(), 
          "Clicked on Checkbox: " + cb.getText() + " is " 
            + cb.isChecked(), Toast.LENGTH_LONG) 
          .show(); 
       } 

      }); 
     } else { 
      chk = (CheckBox) convertView.getTag(); 
     } 
     Task current = taskList.get(position); 
     chk.setText(current.getTaskName()); 
     chk.setChecked(current.getStatus() == 1 ? true : false); 
     chk.setTag(current); 
     Log.d("listener", String.valueOf(current.getId())); 
     return convertView; 
    } 

} 
} 

주요 활동

public class MainActivity extends Activity { 

private Context activity; 

@Override 
protected void onCreate (Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    entrarboton(); 
} 

private void entrarboton() { 
    ImageButton accionentrar = (ImageButton) findViewById(R.id.imageButton0); 
    accionentrar.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.android.calendar"); 
      startActivity(LaunchIntent); 


     } 
    }); 
    ImageButton accionentrar2 = (ImageButton) findViewById(R.id.imageButton3); 
    accionentrar2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(MainActivity.this,Notes.class)); 

     } 
    }); 
    ImageButton accionentrar3 = (ImageButton) findViewById(R.id.imageButton2); 
    accionentrar3.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(MainActivity.this,ViewTask.class)); 
     } 
    }); 
    ImageButton accionentrar4 = (ImageButton) findViewById(R.id.imageButton4); 
    accionentrar4.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivity(new Intent(MainActivity.this,Altres.class)); 
     } 
    }); 

    AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView); 

    String[] noms = getResources() . getStringArray(R.array.noms_array); 

    ArrayAdapter<String> adapter; 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, noms); 

    auto.setThreshold(1); 

    auto.setAdapter(adapter); 


} 

} 

안드로이드 매니페스트 :

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.dppalvaplicacio.app.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.dppalvaplicacio.app.Calendari" 
     android:label="@string/title_activity_calendari" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.dppalvaplicacio.app.Notes" 
     android:label="@string/title_activity_notes" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.dppalvaplicacio.app.ViewTask" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.dppalvaplicacio.app.Altres" 
     android:label="@string/title_activity_altres" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
</application> 

로그 캣

Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.dppalvaplicacio.app/databases/taskerManager 
at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:520) 
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:263) 
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
at com.dppalvaplicacio.app.TaskerDbHelper.getAllTasks(TaskerDbHelper.java:70) 
at com.dppalvaplicacio.app.ViewTask.onCreate(ViewTask.java:33) 
at android.app.Activity.performCreate(Activity.java:5008) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
at android.app.ActivityThread.access$600(ActivityThread.java:130) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4745) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 

public class TaskerDbHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; // Database Name private static final String DATABASE_NAME = "taskerManager"; // tasks table name private static final String TABLE_TASKS = "tasks"; // tasks Table Columns names private static final String KEY_ID = "id"; private static final String KEY_TASKNAME = "taskName"; private static final String KEY_STATUS = "status"; public TaskerDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_TASKS + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_TASKNAME + " TEXT, " + KEY_STATUS + " INTEGER)"; db.execSQL(sql); db.close(); } @Override public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { // Drop older table if existed db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKS); // Create tables again onCreate(db); } // Adding new task public void addTask(Task task) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_TASKNAME, task.getTaskName()); // task name // status of task- can be 0 for not done and 1 for done values.put(KEY_STATUS, task.getStatus()); // Inserting Row db.insert(TABLE_TASKS, null, values); db.close(); // Closing database connection } public List<Task> getAllTasks() { List<Task> taskList = new ArrayList<Task>(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_TASKS; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { Task task = new Task(); task.setId(cursor.getInt(0)); task.setTaskName(cursor.getString(1)); task.setStatus(cursor.getInt(2)); // Adding contact to list taskList.add(task); } while (cursor.moveToNext()); } // return task list return taskList; } public void updateTask(Task task) { // updating row SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_TASKNAME, task.getTaskName()); values.put(KEY_STATUS, task.getStatus()); db.update(TABLE_TASKS, values, KEY_ID + " = ?",new String[] {String.valueOf(task.getId())}); db.close(); } 

TaskDbHelper

}

+0

문제는 TaskerDbHelper.java:70입니다. 수업을 게시하십시오. – StarsSky

+0

오류는 TaskDBHelper에 있습니다. 제발 코드를 게시하십시오 (나는 문제가있을 수있는 좋은 생각이있어) –

+0

오류가 명확하게 닫힌 데이터베이스를 열고 있다고 말합니다 – sanket

답변

0

문제는 당신 TaskDBHelper 클래스이며,보다 구체적으로 onCreate 방법. 이 방법은 데이터베이스에서 작업을 시도 할 때이 자동으로 이라고하지만 데이터베이스가 아직 작성되지 않았습니다. 따라서 먼저 onCreate 메서드를 호출 한 다음 해당 메서드, 즉 사용자의 경우 getAllTasks 메서드를 호출합니다. 문제는 onCreate 메서드에서 데이터베이스를 닫고이 클래스 인스턴스 내에서 데이터베이스 작업이 더 이상 수행되지 않도록하는 것입니다. 방법은 다음과 같아야합니다.

public void onCreate(SQLiteDatabase db) { 

    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_TASKS + " (" 
      + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_TASKNAME 
      + " TEXT, " + KEY_STATUS + " INTEGER)"; 
    db.execSQL(sql); 
} 
+0

그것은 작동합니다! 고마워요 !! 한 가지 더 질문 : 그들이 작업을 제거 할 수 있도록 내가해야 할 일은 무엇입니까? – pkssssss

+0

조회 SQLiteDatabase의 삭제 방법 -> http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#delete%28java.lang.String,%20java.lang.String,%20java.lang .String [] % 29 삭제 방법에 대해 추가 질문이 있으면 다른 질문을 엽니 다. –

관련 문제