[Android] 数据实体的自动存取--SQLite篇
本例代码以SQLite为数据存取载体。
在"SharedPreferences篇"中,已知数据的自动存储原理是使用Java反射的方法获取数据实体类中的Field进行的存储的。
当以SQLite为数据存取载体时,需要解决一个问题是:如何标明类中的某个Field是primary key(主键)呢。
为解决此问题,此处引入并使用了Java Annotation(内注)。Annotation可以保留一些自定义的注释信息并且这些可以在被编译后仍保留着甚至被JVM运行时获取。相应文章请查看:[Java] Annotation(内注)实例一则
本示例代码实现了一个Mark Annotation(标记内注),用于修饰Field标明其为主键。
被修饰的主键将影响自动生成的sql执行语句。如下代码:
[java]
/** 根据类结构构造表。 */
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
[java]
package lab.sodino.autosave.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @inte易做图ce primary {
}
lab.sodino.autosave.db.DBHelper
[java]
package lab.sodino.autosave.db;
import java.io.File;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import lab.sodino.autosave.GoodsBean;
import lab.sodino.autosave.LogOut;
import lab.sodino.autosave.annotation.primary;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private SQLiteDatabase sqlDb;
public static final int VERSION = 1;
public static final Map<Class<?>, String> TYPES;
static {
TYPES = new HashMap<Class<?>, String>();
TYPES.put(byte.class, "BYTE");
TYPES.put(boolean.class, "INTEGER");
TYPES.put(short.class, "SHORT");
TYPES.put(int.class, "INTEGER");
TYPES.put(long.class, "LONG");
TYPES.put(String.class, "TEXT");
TYPES.put(byte[].class, "BLOB");
TYPES.put(float.class, "FLOAT"); // REAL
TYPES.put(double.class, "DOUBLE"); // REAL
}
public DBHelper(Context context) {
super(context, context.getPackageName(), null, VERSION);
File dbFile = context.getDatabasePath(context.getPackageName());
if (dbFile.exists() == false) {
LogOut.out(this, "DBFile does not exist.");
// 去调用onCreate()和onUpgrade()建表
getWritableDatabase();
// initAllDBItem();
close();
LogOut.out(this, "InitDB finished!!!");
} else {
LogOut.out(this, "DBFile does exist.");
}
}
public void openDBHelper() {
sqlDb = getWritableDatabase();
}
public void close() {
if (sqlDb != null) {
sqlDb.close();
}
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
String sqlTableBuilding = getTableBuildingSQL(GoodsBean.class);
LogOut.out(this, "sql[" + sqlTableBuilding + "]");
db.execSQL(sqlTableBuilding);
}
/** 根
补充:移动开发 , Android ,