2017-12-27 43 views
0

내 문제는 앱 충돌입니다. 불행히도 앱이 중지되었습니다.SQLite로 데이터 저장 및 ListView에 추가하기

MainActivity.java

public class MainActivity extends AppCompatActivity { 


DatabaseHelper myDB; 
Button btnAdd; 
Button btnList; 
TextView tvView; 
EditText editText; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    btnAdd = (Button) findViewById(R.id.btnAdd); 
    btnList = (Button) findViewById(R.id.btnList); 
    tvView = (TextView) findViewById(R.id.Textview); 
    editText = (EditText) findViewById(R.id.editText); 
    myDB=new DatabaseHelper(this); 


    btnAdd.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      String newEntry = editText.getText().toString(); 
      if (newEntry.length() != 0) { 
       AddData(newEntry); 
       editText.setText(""); 
      } else { 
       Toast.makeText(MainActivity.this, "You must put something in the text field", Toast.LENGTH_LONG).show(); 
      } 
     } 

    }); 
    btnList.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(MainActivity.this, ListDataActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 


public void AddData(String newEntry) { 
    boolean insertData = myDB.addData(newEntry); 
    // check inserted successfully 
    if (insertData == true) { 
     Toast.makeText(MainActivity.this, "Successfully Entered Data!", Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(MainActivity.this, "Something went wrong", Toast.LENGTH_LONG).show(); 
    } 
} 

}

ListAcitivity.java

공용 클래스 ListDataActivity는 {

DatabaseHelper myDB; 
ListView listView; 
ArrayAdapter<String>listAdapter; 


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

    listView=(ListView)findViewById(R.id.listView); 
    myDB= new DatabaseHelper(this); 


    //populate an ArrayList<String> from the databases and then view it 
    ArrayList<String> theList=new ArrayList<>(); 
    Cursor data=myDB.getListContent(); 

    if(data.getCount()==0){ 
     Toast.makeText(ListDataActivity.this,"The database was empty",Toast.LENGTH_LONG).show(); 
    }else{ 
     while(data.moveToNext()){ 
      theList.add(data.getString(1)); 
      listAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,theList); 
      listView.setAdapter(listAdapter); 
     } 
    } 
} 

DatabaseHelper.java

AppCompatActivity를 확장 29 : 26.268 24636-24636/sg.edu.rp.c346.todolist E/AndroidRuntime

공용 클래스 DatabaseHelper는 SQLiteOpenHelper {

public static final String DATABASE_NAME = "mylist.db"; 
public static final String TABLE_NAME = "mylist_data"; 
public static final String COL1 = "ID"; 
public static final String COL2 = "ITEM1"; 

public DatabaseHelper(Context context){ 
    super (context, DATABASE_NAME, null , 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String createTable="CREATE TABLE"+ TABLE_NAME +"(ID INTEGER PRIMARY KEY AUTOINCREMENT,"+ 
      "ITEM1 TEXT)"; 
      db.execSQL(createTable); 
    db.close(); 


} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP IF TABLE EXITS "+ TABLE_NAME); 
    onCreate(db); 
    db.close(); 



} 
public boolean addData(String item1) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL2, item1); 


    long result = db.insert(TABLE_NAME, null, contentValues); 

    //if date as instered incorrectly it will return -1 
    if (result == -1) { 
     return false; 
    } else { 
     return true; 
    } 
} 
    /** 
    * Return all the data from database 
    * @return 
    */ 
    public Cursor getListContent() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor data =db.rawQuery("SELECT * FROM " + TABLE_NAME,null); 
    return data; 


} 

}

로그 캣 쇼

12 ~ 27 07 확장 : 치명적인 예외 : 주 프로세스 : sg.edu.rp.c346.todolist, PID : 24636 java.lang.IllegalStateException : 이미 닫힌 개체를 다시 열려고 시도 함 : SQLiteDatabase : /data/data/sg.edu. rp.c346.todolist/databases/mylist.db 에서 android.database.sqlite.SQLiteClosable.acquireReference (SQLiteClosable.java:55) android.database.sqlite.SQLiteDatabase.endTransaction (SQLiteDatabase.java:520) android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java : 263) android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:164) at sg.edu.rp.c346.todolist.DatabaseHelper.addData (DatabaseHelper.java:45) at sg.edu.rp .c346.todolist.MainActivity.AddData (MainActivity.java:58) at sg.edu.rp.c346.todolist.MainActivity $ 1.onClick (MainActivity.java:39) android.view.View.performClick (View. java : 4438) at android.view.View $ PerformClick.run (View.java:18422) (android.os.Handler.handleCallback (Handler.java:733) android.os.Handler.dispatchMessage (Handler.java:95) java.lang.reflect.Method.invokeNative에서 android.app.ActivityThread.main (ActivityThread.java:5017) 에서 android.os.Looper.loop (Looper.java:136) (기본 방법) 에서 자바에서 .lang.reflect.Method.invoke (Method.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:595) dalvik.system.NativeStart.main (기본 메소드) 12-27 07 : 29 : 28.078 24636-24636 /? I/Process : 신호를 보내는 중. PID : 24636 SIG : 9

답변

0

onCreate()onUpgrade()SQLiteDatabase을 입력해야합니다. 자신이 획득 한 데이터베이스 핸들은 close()입니다.

+0

감사합니다. 그것은 지금 일한다! – Junhao

1

myDB 인스턴스를 초기화하지 않은 것 같습니다.

LocalDB에 항목을 추가하기 전에 onCreate 메서드의 myDB = new DatabaseHelper(this) 어딘가에 전화하십시오.

+0

myDB 인스턴스를 초기화하는 방법. – Junhao

+0

편집 내 대답 –

+0

보호 된 void onCreate (번들 savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); btnAdd = (버튼) findViewById (R.id.btnAdd); btnList = (버튼) findViewById (R.id.btnList); tvView = (TextView) findViewById (R.id.Textview); editText = (EditText) findViewById (R.id.editText); myDB = new DatabaseHelper (this); – Junhao

0

액세스하기 전에 myDB 변수를 초기화해야합니다.MainActivity.java에서 Helper 클래스를 초기화하지 않습니다.

myDB= new DatabaseHelper(this); 

이렇게하면됩니다. 이 조건을 변경하십시오.

if (editText.length() != 0) { // Change this to newEntry.length() !=0 
      AddData(newEntry); 
      editText.setText(""); 
     } else { 
      Toast.makeText(MainActivity.this, "You must put something in the text field", Toast.LENGTH_LONG).show(); 
     } 

희망이 있습니다.

+0

어디에서 myDB를 초기화할까요? – Junhao

+0

MainActivity에서 -> onCreate 메소드. –

+0

protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); btnAdd = (버튼) findViewById (R.id.btnAdd); btnList = (버튼) findViewById (R.id.btnList); tvView = (TextView) findViewById (R.id.Textview); editText = (EditText) findViewById (R.id.editText); myDB = new DatabaseHelper (this); – Junhao