[Android] 数据实体的自动存取--SQLite篇

本例代码以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执行语句。如下代码:
	/** 根据类结构构造表。 */
	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.
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值