关于android sqlite数据库使用的几点心得

1.error code 19: 错误原因(下面三种是网友总结的)

情况1:你定义的字段为 not null而插入时对应的字段却没值。
情况2:你定义的字段设定PRIMARY,而插入的值已经在表中存在。
情况3:在进行修改的时候set的id与where的id不同。

我自己遇到的情况时这样的:
    public void insert(Friend data) {
        String sql = "insert into " + DatabaseHelper.FRIENDS_TABLE_NAME;

        sql += "(_id, name, nickname, portrait, fromcity) values( ?, ?, ?, ?,?)";//_id为主键

        SQLiteDatabase sqlite = dbHelper.getWritableDatabase();
        sqlite.execSQL(sql, new String[] {
                data.getId() + "",  + "",data.getName() + "", data.getNickname(),data.getPortrait(), data.getFrom() + "" });
        sqlite.close();
    }

这里的问题就出在_id上,data对象里面的_id根本就没有赋值,默认为0,所以每次插入一个数据_id都会是0。因为我们已经将_id设置为自增的主键了,所以可以省略掉,如下:

    public void insert(Friend data) {
        String sql = "insert into " + DatabaseHelper.FRIENDS_TABLE_NAME;

        sql += "(name, nickname, portrait, fromcity) values( ?, ?, ?,?)";

        SQLiteDatabase sqlite = dbHelper.getWritableDatabase();
        sqlite.execSQL(sql, new String[] {
                data.getName() + "", data.getNickname(),
                data.getPortrait(), data.getFrom() + "" });
        sqlite.close();
    }

2.sqlite中的字段名

以上段代码中的数据库表格为例:

 public static final String CREATE_FRIENDS_TABLE = "create table "
            + FRIENDS_TABLE_NAME
            + " (_id integer primary key autoincrement,"
            + " name nvarchar(10), nickname nvarchar(20), portrait text, from text)";

其中,from字段定义有问题,我本打算定义居住地址属性,但from已被数据库占用为关键字,所以编译出了问题,换成fromcity就可以用了

3.忘记空格符问题
我在对数据进行具体的query时,添加字段时忘记空格,导致编译错误,如下

public List<Friend> query(String where) {
        SQLiteDatabase sqlite = dbHelper.getReadableDatabase();
        ArrayList<Friend> data = null;
        data = new ArrayList<Friend>();
        Cursor cursor = sqlite.rawQuery("select * from "
                + DatabaseHelper.FRIENDS_TABLE_NAME + where, null);
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            Friend friend = new Friend();
            friend.setId(cursor.getInt(0));
            friend.setName(cursor.getString(1));
            friend.setNickname(cursor.getString(2));
            friend.setPortrait(cursor.getString(3));
            friend.setFrom(cursor.getString(4));
            data.add(friend);
        }
        if (!cursor.isClosed()) {
            cursor.close();
        }
        sqlite.close();

        return data;
    }
     FriendDatabase database = new FriendDatabase(this);
     List<Friend> friendList = database.query("where name=james");

按照上面编译,查询语句将会变成:
select * from ff_friendswhere name=james
很明显,where 前面缺少空格。
此外上段程序还有错,字段对应的值若为字符串,应该加上’ ‘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值