2017-12-27 2 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はAppCompatActivity {

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

を拡張します

パブリッククラス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; 


} 

}

LOGCATショー

12-27 07延び:29:26.268 24636から24636/sg.edu.rp.c346.todolist E/AndroidRuntimeを:致命的な例外:メイン プロセス: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) at 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) android.os.Looper.loop(Looper.java:136)の とandroid.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(ネイティブメソッド) at java .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) (ネイティブメソッド) 12-27 07:29:28.078 24636-24636 /? I /プロセス:シグナルを送信します。 PID:24636 SIG:9

答えて

0

onCreate()onUpgrade()には、SQLiteDatabaseが与えられてはいけません。自分で取得したデータベースハンドルはclose()のみです。

+0

ありがとうございます。それは今作動する! – Junhao

1

myDBインスタンスを初期化していないようです。

LocalDBにエントリを追加する前に、onCreateメソッドのどこかでmyDB = new DatabaseHelper(this)メソッドを呼び出してください。

+0

myDBインスタンスを初期化する方法。 – Junhao

+0

編集した私の答え –

+0

保護された無効な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 =新しいDatabaseHelper(これ); – 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

保護された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 =新しいDatabaseHelper(これ); – Junhao

関連する問題