将数据保存到数据库并在 ListView 中检索

Posted

技术标签:

【中文标题】将数据保存到数据库并在 ListView 中检索【英文标题】:Saving data to database and retrieving it in a ListView 【发布时间】:2017-03-12 08:10:41 【问题描述】:

我正在制作小型待办事项应用程序,但我卡住了。 这个想法是:

将数据保存到数据库中 -> 在 ListView 中检索它。

目前,我的应用程序在我按下“BUILD!”后立即崩溃!按钮,尽管我认为它应该只说“已保存!” (以确保将数据保存到数据库中)。 非常感谢有关如何在 ListView 中显示该数据的一些提示。

P.S.:这是我的第一个应用,所以不要苛刻

代码:

主要活动

package com.example.mrti.todo2;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity 

TaskDbHelper taskDbHelper;
SQLiteDatabase SQLdb;
ArrayAdapter<String> itemsAdapter;
Context context;

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

    ListView lvItems = (ListView) findViewById(R.id.listView);
    ArrayList<String> items = new ArrayList<String>();

    itemsAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, items);
    lvItems.setAdapter(itemsAdapter);




// ADDING YOUR FUTURE GOALS!
public void onBuildButton (View view)
    EditText dreamText = (EditText) findViewById(R.id.dreamText);
    String task = dreamText.getText().toString();

    //db
    taskDbHelper = new TaskDbHelper(context);
    SQLdb = taskDbHelper.getWritableDatabase();
    taskDbHelper.insertData(task, SQLdb);
    Toast.makeText(getBaseContext(), "Saved!", Toast.LENGTH_LONG).show();
    taskDbHelper.close();




TaskDBHelper.java

public class TaskDbHelper extends SQLiteOpenHelper 

private static final String DATABASE_NAME = "TASKS.db";
private static final int DB_VERSION = 1;
private static final String CREATE_QUERY =
                        "CREATE TABLE " +         TaskContract.newTaskInfo.TABLE_NAME + " ( " +
                        TaskContract.newTaskInfo.TASK_NAME + " TEXT NOT NULL);";


public TaskDbHelper(Context context) 
    super(context, DATABASE_NAME, null, DB_VERSION);


@Override
public void onCreate(SQLiteDatabase db) 
    db.execSQL(CREATE_QUERY);
    Log.e("DB Operations", "Table created...");


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    db.execSQL("DROP TABLE IF EXISTS " + TaskContract.newTaskInfo.TABLE_NAME);
    onCreate(db);

// For adding new data to database
public void insertData(String task, SQLiteDatabase db)
    ContentValues contentValues = new ContentValues();
    contentValues.put(TaskContract.newTaskInfo.TASK_NAME, task);
    db.insert(TaskContract.newTaskInfo.TABLE_NAME, null, contentValues);
        Log.e("DB Operations", "1 record added...");



TaskContract.java

public class TaskContract 

public static abstract class newTaskInfo
    public static final String TASK_NAME = "task_name"; // Table field
    public static final String TABLE_NAME = "task_info"; // Name of the table

【问题讨论】:

如果应用崩溃,请显示logcat。 提示:使用 CursorAdapter,而不是 ArrayAdapter @cricket_007 大约有 30 行错误。不知道我应该给你看哪一个。也许复制/粘贴我的代码并自己检查会更容易?或者有没有特定的方法来查找错误@logcat? 复制大部分内容。重要的行包含Caused by,以及它后面的行。 ***.com/questions/23353173/… 另外,您可以将getWritableDatabase() 移动到insertData 方法中。而不是一个参数。 SqliteOpenHelper 的原因是对 Activity 类隐藏原始数据库对象 【参考方案1】:

您的 context 变量为空且不必要。

Activity 是上下文,所以使用它来代替

taskDbHelper = new TaskDbHelper(MainActivity.this);

【讨论】:

非常感谢! 就像我说的,CursorAdapter

以上是关于将数据保存到数据库并在 ListView 中检索的主要内容,如果未能解决你的问题,请参考以下文章

将检索到的值加载到 listView 时应用程序崩溃

从数据库中检索 MS Word 文档并在本地保存

如何在 qml 中没有 listmodel 的情况下存储嵌套 ListView 的数据并在之后检索

将 AM PM 时间字符串存储到 MySQL 中的 TIME 数据类型中,并在显示时使用 AM PM 检索?

如何将数据从 firebase 检索到 ListView?

检索数据未出现在 ListView 的片段中