本例代码以SQLite为数据存取载体。
在 "SharedPreferences篇"中,已知数据的自动存储原理是使用Java反射的方法获取数据实体类中的Field进行的存储的。
当以SQLite为数据存取载体时,需要解决一个问题是:如何标明类中的某个Field是primary key(主键)呢。
为解决此问题,此处引入并使用了Java Annotation(内注)。Annotation可以保留一些自定义的注释信息并且这些可以在被编译后仍保留着甚至被JVM运行时获取。相应文章请查看: [Java] Annotation(内注)实例一则
本示例代码实现了一个Mark Annotation(标记内注),用于修饰Field标明其为主键。
在对实体类的属性进行命名时,应避免"order"、"group"等SQL语句中的关键字。否则易出现如下异常(属性名出现'order'关键字):
android.database.sqlite.SQLiteException: near "order": syntax error (code 1): , while compiling: CREATE TABLE IF NOT EXISTS EmoPackage (_id INTEGER PRIMARY KEY AUTOINCREMENT,epId INTEGER UNIQUE,name TEXT, order INTEGER,price INTEGER)
被修饰的主键将影响自动生成的sql执行语句。如下代码:
在 "SharedPreferences篇"中,已知数据的自动存储原理是使用Java反射的方法获取数据实体类中的Field进行的存储的。
当以SQLite为数据存取载体时,需要解决一个问题是:如何标明类中的某个Field是primary key(主键)呢。
为解决此问题,此处引入并使用了Java Annotation(内注)。Annotation可以保留一些自定义的注释信息并且这些可以在被编译后仍保留着甚至被JVM运行时获取。相应文章请查看: [Java] Annotation(内注)实例一则
本示例代码实现了一个Mark Annotation(标记内注),用于修饰Field标明其为主键。
在对实体类的属性进行命名时,应避免"order"、"group"等SQL语句中的关键字。否则易出现如下异常(属性名出现'order'关键字):
android.database.sqlite.SQLiteException: near "order": syntax error (code 1): , while compiling: CREATE TABLE IF NOT EXISTS EmoPackage (_id INTEGER PRIMARY KEY AUTOINCREMENT,epId INTEGER UNIQUE,name TEXT, order INTEGER,price INTEGER)
被修饰的主键将影响自动生成的sql执行语句。如下代码:
/** 根据类结构构造表。 */
private String getTableBuildingSQL(Class<?> clazz) {
StringBuilder strBuilder = new StringBuilder("create table if not exists ");
strBuilder.append(clazz.getSimpleName());
strBuilder.append("(");
// getDeclaredFields():只获取该类文件中声明的字段
// getFields():获取该类文件、其父类、接口的声明字段
Field[] arrField = clazz.getFields();
for (int i = arrField.length - 1; i >= 0; i--) {
Field f = arrField[i];
String type = TYPES.get(f.getType());
if (type == null) {
continue;
} else {
strBuilder.append(f.getName() + " " + type);
if (f.isAnnotationPresent(primary.class)) {
strBuilder.append(" PRIMARY KEY");
}
if (i > 0) {
strBuilder.append(",");
}
}
}
strBuilder.append(")");
return strBuilder.toString();
}
其余的代码是普通的SQLite操作及与“SharedPreferences篇”中的处理手法一致。不再冗述。
本文为Sodino所有,转载请注明出处:http://blog.csdn.net/sodino/article/details/7996088
上代码:lab.sodino.autosave.annotation.primary
package lab.sodino.autosave.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.