java - 使用 SQLite 保存数据并将其添加到 ListView

标签 java android sqlite listview save

我的问题是应用程序崩溃,不幸的是,它显示应用程序已停止。

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

公共(public)类 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

公共(public)类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:致命异常:main 进程: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) 在 sg.edu.rp.c346.todolist.DatabaseHelper.addData(DatabaseHelper.java:45) 在 sg.edu.rp.c346.todolist.MainActivity.AddData(MainActivity.java:58) 在 sg.edu.rp.c346.todolist.MainActivity$1.onClick(MainActivity.java:39) 在 android.view.View.performClick(View.java:4438) 在 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) 在 java.lang.reflect.Method.invokeNative( native 方法) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 在dalvik.system.NativeStart.main( native 方法) 12-27 07:29:28.078 24636-24636/? I/Process:发送信号。 PID:24636 SIG:9

最佳答案

您似乎没有初始化 myDB 实例。

在尝试将条目添加到 LocalDB 之前,请在 onCreate 方法中的某个位置调用 myDB = new DatabaseHelper(this)

关于java - 使用 SQLite 保存数据并将其添加到 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47991892/

相关文章:

java - 打包在 EAR 文件中的 JAR 文件中的 JSP taglib

android - MediaPlayer 即使在 mediaplayer.pause() 之后继续在后台播放;

Android - Toast 消息的替代品

objective-c - SQLite 缓存与应用程序缓存

java - 数据库到游标,游标到数组列表和数组列表到名称值对的字符串。

java - ElasticSearch - 打开的文件太多

java - 在 DB 中克服的值(value)

java - 使用涉及复杂标准的 JPA Criteria API 进行分页

android - ScrollView 中的 ConstraintLayout 不滚动

objective-c - 从 SQLite 数据库填充 SplitViewController 中的 UITableView 和 DetailsView