java - 在 SQLite Android 中保存元素

标签 java android database sqlite cursor

我想在安卓应用程序中将 DatabaseTableDay 保存到我的 SQLite,但出了点问题。

我的 DatabaseDAODay 是:

public class DatabaseDAODay {

    public static final String TAG = "DaysDAO";

    // Database fields
    private SQLiteDatabase mDatabase;
    private DatabaseHelper mDbHelper;
    private Context mContext;
    private String[] mAllColumns = { DatabaseHelper.COLUMN_DAY_ID,
            DatabaseHelper.COLUMN_DAY_NAME, DatabaseHelper.COLUMN_DAY_WEIGHT};

    public DatabaseDAODay(Context context) {
        this.mContext = context;
        mDbHelper = new DatabaseHelper(context);
        // open the database
        try {
            open();
        } catch (SQLException e) {
            Log.e(TAG, "SQLException on openning database " + e.getMessage());
            e.printStackTrace();
        }
    }

    public void open() throws SQLException {
        mDatabase = mDbHelper.getWritableDatabase();
    }

    public void close() {
        mDbHelper.close();
    }

    public DatabaseTableDay createDay(String name, float weight, Long id) {
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_DAY_NAME, name);
        values.put(DatabaseHelper.COLUMN_DAY_WEIGHT, weight);
        long insertId = id;
        Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns,
                DatabaseHelper.COLUMN_DAY_ID + " = " + insertId, null, null,
                null, null);
        DatabaseTableDay newDay = new DatabaseTableDay();
        if(cursor != null && cursor.moveToFirst()){
            newDay = cursorToDay(cursor);
            cursor.close();
            Toast.makeText(mContext,"im here",Toast.LENGTH_LONG).show();
        }
        return newDay;
    }



    public void deleteDay(DatabaseTableDay databaseTableDay) {
        long id = databaseTableDay.getId();
        // delete all employees of this company
        DatabaseDAOActivity databaseDAOActivity = new DatabaseDAOActivity(mContext);
        List<DatabaseTableActivity> databaseTableActivities = databaseDAOActivity.getActivitiesOfDay(id);
        if (databaseTableActivities != null && !databaseTableActivities.isEmpty()) {
            for (DatabaseTableActivity e : databaseTableActivities) {
                databaseDAOActivity.deleteActivity(e);
            }
        }

        System.out.println("the deleted day has the id: " + id);
        mDatabase.delete(DatabaseHelper.TABLE_DAYS, DatabaseHelper.COLUMN_DAY_ID
                + " = " + id, null);
    }


    public List<DatabaseTableDay> getAllDays() {
        List<DatabaseTableDay> listDays = new ArrayList<DatabaseTableDay>();

        Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns,
                null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                DatabaseTableDay day = cursorToDay(cursor);
                listDays.add(day);
                cursor.moveToNext();
            }
            // make sure to close the cursor
            cursor.close();
        }
        return listDays;
    }


    public DatabaseTableDay getDayById(long id) {
        Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns,
                DatabaseHelper.COLUMN_DAY_ID + " = ?",
                new String[] { String.valueOf(id) }, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }

        DatabaseTableDay databaseTableDay = cursorToDay(cursor);
        return databaseTableDay;
    }

    protected DatabaseTableDay cursorToDay(Cursor cursor) {
        DatabaseTableDay databaseTableDay = new DatabaseTableDay();
        databaseTableDay.setId(cursor.getLong(0));
        databaseTableDay.setName(cursor.getString(1));
        databaseTableDay.setWeight(cursor.getLong(2));
        return databaseTableDay;
    }


}

我尝试通过以下方式保存它:

saveButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DatabaseTableDay databaseTableDay = databaseDAODay.createDay(
                editText.getText().toString(), 100f, new Long(myId));

        List<DatabaseTableDay> list = databaseDAODay.getAllDays();
    }
});

但是 list 无论如何都是空的。

可能问题出在 DatabaseDAODay 中的 createDay() 方法,因为如果条件始终为 null 并且应用程序不会运行 cursorToDay() 方法。

我遇到了没有条件的问题,如果只有 cursot.moveToFirst() 然后是 cursorToDay() 就会出现 NullPoinerException - 因为 coursor为空。我关注了this并放置条件 !=null 但实际上什么也没有发生并且 List 始终为空...

我该如何解决我的问题?

最佳答案

您对 createDay() 的问题是正确的:您尝试使用 从数据库中读取,而不是使用 insert() 插入新的一天>查询()

像这样改变你的方法:

public DatabaseTableDay createDay(String name, float weight, Long id) {

    DatabaseTableDay dayToReturn;
    ContentValues values = new ContentValues();
    values.put(DatabaseHelper.COLUMN_DAY_NAME, name);
    values.put(DatabaseHelper.COLUMN_DAY_WEIGHT, weight);
    values.put(DatabaseHelper.COLUMN_DAY_ID, id);

    long resID = mDatabase.insert(DatabaseHelper.TABLE_DAYS, null, values);
    if (resID == -1)
    {
       // something went wrong, do error handling here
       dayToReturn = null;
    }
    else
    {
        // no error: resID is "the row ID of the newly inserted row"
        // you only need this info if you are using autoincrement 
        // not if you set the ID yourself

        // all right, this will work -
        // but somehow it hurts a little to retrieve an entry I just added.
        // I'd like much more to simply use a constructor with all the values 
        // and create a new DatabaseTableDay instance
        dayToReturn = getDayById(id);
    }     

    return dayToReturn;
}

另请参阅 SQLiteDatabase insert() 文档链接

关于java - 在 SQLite Android 中保存元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39253421/

相关文章:

android - 如何制作像redbus一样的座位预订布局

node.js - Sequelize Associations - 关联表

database - 触发器与非规范化存储过程的优缺点

android - 如何打开Isar检查器

android - 初始化数据库时如何显示启动画面?

mysql - 如何根据特定值显示数据

java - 谁能推荐一个好的java lib来内省(introspection)视频?

java - Socket getOutputStream 耗时太长

java - 如何将证书文件添加/转换为 pkcs12 文件

java - 使用嵌套循环绘制网格