在Android上的SQLite中查询和使用游标

不确定我是否是唯一感受到这一点的人……

我发现在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) 

啊,我感觉好多了:)

干杯四

Solutions Collecting From Web of "在Android上的SQLite中查询和使用游标"

  1. 如果不需要,请不要使用模型对象。 我得出结论,除非有重要的业务逻辑只能通过模型​​对象表示,否则它们比移动平台中的价值更麻烦。
  2. 假设您遇到了模型对象,请让它们自己从Cursor加载,而不是尝试传递无数的参数。
  3. 如果你知道SQL,那么query()rawQuery()更加冗长有限的附加值。
  4. 通过连接来组装您的CREATE TABLE子句是自我强加的痛苦,而非SQLite或Android强制要求。
  5. 不要使用自定义编写的代码中的getColumnIndexOrThrow() 。 您编写了查询,因此您知道列的返回顺序。如果您要创建一些不知道给定Cursor细节的抽象库, getColumnIndexOrThrow()使用类似getColumnIndexOrThrow()的内容。
  6. Stringinheritance自CharSequence ,因此可以删除所有这些强制转换。

我在SQLite中测试了很多SQL,然后将它们作为字符串复制到Android。 当我可以直接与命令行交互时,我更容易调试。

我使用的另一种技术是将尽可能多的查询保存为字符串常量或字符串资源。

您也不需要SQL,例如INTEGER NOT NULL因为SQLite使用duck typing / manifesttypes。 它确实有助于types亲和力..