不确定我是否是唯一感受到这一点的人......
我发现在android中使用sqlite api完全痛苦的屁股和漂亮的灵魂摧毁。有没有人有任何提示/助手让我的生活更轻松?
这是我正在谈论的一个例子。
//create code
db.execSQL("CREATE TABLE " + CUSTOMER_TABLE_NAME + " ("
+ GENERIC_ID_KEY+ " INTEGER PRIMARY KEY NOT NULL, "
+ PHONE_KEY + " INTEGER NOT NULL, "
+ CUSTOMER_NAME_KEY+ " TEXT NOT NULL, "
+ EMAIL_KEY + " TEXT NOT NULL, "
+ ADDRESS_KEY +" TEXT);");
//get code
Cursor mCursor = mDb.query(true, CUSTOMER_TABLE_NAME, new String[] {GENERIC_ID_KEY,
ADDRESS_KEY, PHONE_KEY, EMAIL_KEY,CUSTOMER_NAME_KEY}, GENERIC_ID_KEY + "=" + customerDbId, null,
null, null, null, null);
Customer customer = new Customer (customerDbId, (CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(CUSTOMER_NAME_KEY)),
(CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(PHONE_KEY)),
(CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(EMAIL_KEY)),
(CharSequence)mCursor.getString(mCursor.getColumnIndexOrThrow(ADDRESS_KEY)));
这是从db查询创建简单客户对象的简单例子;我的一些代码比这更糟糕。以这种方式手工制作查询会导致我在运行之前找不到的各种错误。
任何提示都很有用!
好了以下提示后我现在有了这个:
db.execSQL("CREATE TABLE customer (_id INTEGER PRIMARY KEY NOT NULL, "
+ "phone_number INTEGER NOT NULL, "
+ "name TEXT NOT NULL, "
+ "email TEXT NOT NULL, "
+ "address TEXT);");
//get code
String q = "SELECT * FROM customer WHERE _id = " + customerDbId +";"
Cursor mCursor = mDb.rawQuery(q, null);
Customer customer = new Customer (mCursor);
在客户中,我访问了这样的字段
mName = cursor.getString(2)
啊,我感觉好多了:)。
干杯 硅
答案 0 :(得分:39)
Cursor
加载,而不是尝试传递无数参数。query()
比rawQuery()
更加冗长有限的附加值。CREATE TABLE
子句是自我强加的痛苦,而不是SQLite或Android强制要求。getColumnIndexOrThrow()
。您编写了查询,因此您知道列将返回的顺序。如果您要创建一些不知道Cursor的详细信息的抽象库,则只使用getColumnIndexOrThrow()
之类的内容。String
继承自CharSequence
,因此可以删除所有这些演员。答案 1 :(得分:3)
我在SQLite中测试了很多SQL,然后将它们作为字符串复制到Android。当我可以直接与命令行交互时,我更容易调试。
我使用的另一种技术是将尽可能多的查询保存为字符串常量或字符串资源。
您也不需要INTEGER NOT NULL
等SQL,因为SQLite使用duck typing / manifest类型。虽然它确实有助于类型亲和力。