2013-07-17 2 views
0

코드와 오류를 수행 ...안드로이드 SQLite는 데이터베이스 오류 여기에 커서

package com.example.tasker; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class TaskerDbHelper extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "Manager"; 

    // 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.getCount()>0){ 
        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); 
        cursor.close(); 
       }else { 
        cursor.close(); 
       }return taskList; 
     } 


//    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); 
//    
//   } else if (cursor.moveToNext()){ 
//    cursor.close(); 
//   } 


     // 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(); 
    } 




}` 

오류

07-17 15 : 49 : 51.889 : E/AndroidRuntime는 (14450)은 : 인한 의해 : java.lang.IllegalStateException : 이미 닫힌 된 개체를 다시 열려고 : SQLiteDatabase : /data/data/com.example.tasker/databases/Manager

+0

이 예외가 발생하는 행을 게시 할 수 있습니까? BTW : 아마 DAO 패턴을 사용하는 것을 고려해보십시오. 코드를 훨씬 쉽게 읽을 수 있습니다. –

+0

sory 나는 아직 초보자이기 때문에 "cursor.close();"오류가 있다고 생각합니다. 내가 그들을 어디에 두어야하는지 모르겠다. .. – user2590608

답변

0

모든 "db.close()"호출 제거 이 코드. 사용할 때마다 데이터베이스를 닫을 필요가 없습니다.

관련 문제