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 前面缺少空格。
此外上段程序还有错,字段对应的值若为字符串,应该加上’ ‘。