您的位置:首页 > 移动开发 > Android开发

android 数据库之greendao

2016-01-01 22:40 429 查看
freemarker-2.3.20.jar和greendao-generator-1.3.1.jar包是数据库代码自动生成需要的jar包,greendao-1.3.7是项目需要的jar包
数据库代码如下:

1)、自动生成数据库相关代码

public static void main(String[] args) throws IOException, Exception {

// 自动生成的代码在HomeFragment存放的路径

Schema schema = new Schema(1, "com.xiaoma.dao");


Entity addressTable = schema.addEntity("address");

addressTable.addStringProperty("uuid");

addressTable.addStringProperty("sequence");

addressTable.addStringProperty("level");

addressTable.addStringProperty("parentid");

addressTable.addStringProperty("name");

addressTable.addStringProperty("initial");


Entity landtypeTable = schema.addEntity("landtype");

landtypeTable.addStringProperty("uuid");

landtypeTable.addStringProperty("sequence");

landtypeTable.addStringProperty("level");

landtypeTable.addStringProperty("name");

landtypeTable.addStringProperty("parentid");


new DaoGenerator().generateAll(schema, "../HomeFragment/src");

}

[/code]

2)、初始化数据库

private void initDataDao() {

db = new DaoMaster.DevOpenHelper(BaseApp.getApplication(),

"initdata.db", null).getWritableDatabase();

DaoMaster master = new DaoMaster(db);

DaoSession session = master.newSession();

landTypeDao = session.getLandtypeDao();

addressDao = session.getAddressDao();

Boolean landTypeTig = PrefereUtils.getInstance().getInitDataTig();

if (landTypeTig == false) {

//初始化数据库数据,从服务器端获取基础数据

initData();

}

}

[/code]

3)、获取服务端数据后,需要把数据插入本地数据库,注意因为是耗时操作,需要在子线程操作

new Thread(new Runnable() {

@Override

public void run() {

landTypeDao.insertAll(db, list);

addressDao.insertAll(db, list1, version);

PrefereUtils.getInstance().savaInitDataVersion(version);

PrefereUtils.getInstance().SaveInitDataTig(true);

db.close();

}

}).start();

[/code]

4)、需要在自动生成的后缀带DAO的类中增加批量增加的方法

//批量增加

public  void insertAll(SQLiteDatabase db, List<landtype> dataList) {

String sql = "insert into LANDTYPE(UUID,SEQUENCE,LEVEL,NAME,PARENTID) values(?,?,?,?,?)";

SQLiteStatement statment = db.compileStatement(sql);

db.beginTransaction();

for (landtype category : dataList) {

statment.bindString(1, category.getUuid());

statment.bindString(2, category.getSequence());

statment.bindString(3, category.getLevel());

statment.bindString(4, category.getName());

statment.bindString(5, category.getParentid() == null ? ""

: category.getParentid());


statment.executeInsert();

}

db.setTransactionSuccessful();

db.endTransaction();

statment.close();

}

[/code]

数据库升级问题
如果升级,值需要修改DaoMaster类里面的SCHEMA_VERSION变量
需要注意的是,如果升级过程中数据库名称与原来的不一样,那么不会走update()方法

THDevOpenHelper helper = new THDevOpenHelper(MainActivity.this, "xiaoma.db", null);

Log.e("xiaoma=","main");

db = helper.getWritableDatabase();

daoMaster = new DaoMaster(db);

daoSession = daoMaster.newSession();

addressDao addressDao = daoSession.getAddressDao();

landtypeDao landtypeDao = daoSession.getLandtypeDao();

address address = new address("444", "444", "444", "4444", "4444", "4444");

landtype landtype = new landtype("55", "555", "555", "555", "55555");

addressDao.insert(address);

landtypeDao.insert(landtype);

//        Log.e("xiaoma=", "delete");

//        deleteDatabase("xiaoma.db");

}



public class THDevOpenHelper extends DaoMaster.OpenHelper {


public THDevOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {

super(context, name, factory);

Log.e("xiaoma=","create");

}


@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

Log.e("xiaoma=","updata");

  //只有数据库名称一直相同时才走该段代码

switch (oldVersion){

case 1:

case 2:

case 3:

Log.e("=======",oldVersion+"=====new version"+newVersion);

deleteDatabase("ima.db");

break;

}

}

}

[/code]

设计数据删除相关操作

/** * 本应用数据清除管理器 */

public class DataCleanManager {

/** * 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) * * @param context */

public static void cleanInternalCache(Context context) {

deleteFilesByDirectory(context.getCacheDir());

}


/** * 清除本应用所有数据库(/data/data/com.xxx.xxx/databases) * * @param context */

public static void cleanDatabases(Context context) {

deleteFilesByDirectory(new File("/data/data/"

+ context.getPackageName() + "/databases"));

}


/**

* * 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) * * @param

* context

*/

public static void cleanSharedPreference(Context context) {

deleteFilesByDirectory(new File("/data/data/"

+ context.getPackageName() + "/shared_prefs"));

}


/** * 按名字清除本应用数据库 * * @param context * @param dbName */

public static void cleanDatabaseByName(Context context, String dbName) {

context.deleteDatabase(dbName);

}


/** * 清除/data/data/com.xxx.xxx/files下的内容 * * @param context */

public static void cleanFiles(Context context) {

deleteFilesByDirectory(context.getFilesDir());

}


/**

* * 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache) * * @param

* context

*/

public static void cleanExternalCache(Context context) {

if (Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {

deleteFilesByDirectory(context.getExternalCacheDir());

}

}


/** * 清除自定义路径下的文件,使用需小心,请不要误删。而且只支持目录下的文件删除 * * @param filePath */

public static void cleanCustomCache(String filePath) {

deleteFilesByDirectory(new File(filePath));

}


/** * 清除本应用所有的数据 * * @param context * @param filepath */

public static void cleanApplicationData(Context context, String... filepath) {

cleanInternalCache(context);

cleanExternalCache(context);

cleanDatabases(context);

cleanSharedPreference(context);

cleanFiles(context);

for (String filePath : filepath) {

cleanCustomCache(filePath);

}

}


/** * 删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理 * * @param directory */

private static void deleteFilesByDirectory(File directory) {

if (directory != null && directory.exists() && directory.isDirectory()) {

for (File item : directory.listFiles()) {

item.delete();

}

}

}

}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: