GreenDao 3

public class User {

@Id

private Long id;

@Index(unique = true)

private String name;

}

@OrderBy

更加某一字段排序 ,例如:@OrderBy(“date ASC”)

@OrderBy(“date ASC”)

private List orders;

@Property

设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:

@Entity (nameInDb = “User”)

public class User {

@Property(nameInDb = “userName”)

private String userName;

}

@NotNull

设置数据库表当前列不能为空

@Transient

添加此标记后不会生成数据库表的列

@Unique

表名该属性在数据库中只能有唯一值

@Entity

public class User {

@Id

private Long id;

@Unique

private String name;

}

注意事项

由于greenDAO 3.0 生成的字段添加了非空约束。字段的类型设置为基本类型(如:int)默认会添加非空约束,字段类型设置为对象类型(如:Integer)默认不会添加非空约束,而且最终生成的sql会使用对象类型

定义int类型

@Entity

public class CommentList {

@Id(autoincrement = true)

private Long id;

private int sendId =0;//发送方ID

private int receiveId;//接收方ID

//------ CommentListDao.java ------

/** Creates the underlying database table. */

public static void createTable(Database db, boolean ifNotExists) {

String constraint = ifNotExists? "IF NOT EXISTS ": “”;

db.execSQL("CREATE TABLE " + constraint + ““COMMENT_LIST” (” + //

“”_id" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id

““SEND_ID” INTEGER NOT NULL ,” + // 1: sendId

““RECEIVE_ID” INTEGER NOT NULL ,” + // 2: receiveId

““SEND_TYPE” INTEGER NOT NULL ,” + // 3: sendType

定义Integer类型

@Entity

public class CommentList {

@Id(autoincrement = true)

private Long id;

private Integer sendId =0;//发送方ID

private Integer receiveId=0;//接收方ID

private Integer sendType=0;//发送方用户类型

// ------ CommentListDao.java ------

/** Creates the underlying database table. */

public static void createTable(Database db, boolean ifNotExists) {

String constraint = ifNotExists? "IF NOT EXISTS ": “”;

db.execSQL("CREATE TABLE " + constraint + ““COMMENT_LIST” (” + //

“”_id" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id

““SEND_ID” INTEGER,” + // 1: sendId

““RECEIVE_ID” INTEGER,” + // 2: receiveId

““SEND_TYPE” INTEGER,” + // 3: sendType

““RECEIVE_TYPE” INTEGER,” + // 4: receiveType

@Property 建表字段命名

使用@Entity建表的时候,默认情况下所有的表名和字段名都是大写的,使用nameInDb 定义表名和类名

@Entity(nameInDb =“User”)

public class User implements Serializable {

@Transient

private static final long serialVersionUID = 1L;

@Id(autoincrement = true )

private Long id;

@Property(nameInDb = “name”)

private String name=“Tom”;

GreenDao 3.3.0版本 设置默认值

默认GreenDao 是没有默认值得,网上说作者不屑于设置,网上搜索后,有很多是修改自动生成的xxxDao 里面的 createTable 中的建表SQL语句

/** Creates the underlying database table. */

public static void createTable(Database db, boolean ifNotExists) {

String constraint = ifNotExists? "IF NOT EXISTS ": “”;

db.execSQL("CREATE TABLE " + constraint + ““USER” (” + //

“”_id" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id

““NAME” TEXT,” + // 1: name

““AGE” INTEGER NOT NULL ,” + // 2: age

““SEX” TEXT,” + // 3: sex

““HEIGHT” INTEGER NOT NULL ,” + // 4: height

““WEIGHT” TEXT);”); // 5: weight

}

也许由于版本的不同,反正3.3没有成功,Android Studio 执行Make Project后还原成原先建表语句,还有人说是修改实体类

@Entity

public class User {

@Id(autoincrement = true)

private Long id;

private String name=“Tom”;

private int age=0;

private String sex;

private int height;

private String weight;

这里有一个坑,这样的方式是可行的,但是如果你这里修改后,去观察UserDao中的建表语句,还是和之前一样是没有变化的.并没有带上 Default 默认值

这样修改后,在插入一条数据,不带默认值的字段赋值后查看数据表,就会发现默认值已经有了,但是UserDao的建表语句还是原来的

@Transient 注解

该注解用于当实体类中有字段不添加到数据表时使用

@Entity

public class User implements Serializable {

@Transient

private static final long serialVersionUID = 1L;

@Id(autoincrement = true)

private Long id

实体类实现 Serializable 报错

这个时候添加一行

@Transient

private static final long serialVersionUID = 1L;

DaoMaster DaoSession 数据操作和表管理

按照上面操作后Build> make project后再自动生成Dao的时候还会生成

  • DaoMaster 建表注册管理表

  • DaoSession 对表进行增删改查

public class GreenDBManager implements IDBManager {

private static final String DB_NAME = “User.db”; //数据库名

private DaoSession mDaoSession;

//private UserTableManager mUserTableManager;

private TablesComponent mTablesComponent;

private DaoMaster daoMaster;

public GreenDBManager init(Application application, String dbName) {

Integer dbVersion = DaoMaster.SCHEMA_VERSION;

mApplication = application;

Class<? extends AbstractDao<?, ?>>[] classes = new Class[]{UserDao.class, UserListDao.class};

//DBUpdateOpenHelper对DaoMaster进行初始化,这样就可以实现数据库升级时的数据迁移

DBUpdateOpenHelper updateOpenHelper = new DBUpdateOpenHelper(application, dbName, mclasses);

daoMaster = new DaoMaster(updateOpenHelper.getWritableDatabase());

//9.0的数据库默认启用了wal,用低版本的sqlite工具是无法查看的,想要兼容可以禁用wal

updateOpenHelper.getWritableDatabase().disableWriteAheadLogging();//启用 enableWriteAheadLogging

mDaoSession = daoMaster.newSession();

//查看数据库更新版本时数据迁移的log

MigrationHelper.DEBUG = false;

//数据库增删改查时的log

QueryBuilder.LOG_SQL = false;

QueryBuilder.LOG_VALUES = false;

//清空缓存

mDaoSession.clear();

return this;

}

@Override

public DaoSession getDaoSession() {

if (mDaoSession==null){

mDaoSession=daoMaster.newSession();

}

return mDaoSession;

}

在Application 里面初始化init后,就可通过 getDaoSession 对所有表进行操作处理了

DBUpdateOpenHelper.java

public class DBUpdateOpenHelper extends DaoMaster.OpenHelper {

Class<? extends AbstractDao<?, ?>>[] mDaoClasses;

public DBUpdateOpenHelper(Context context, String name, Class<? extends AbstractDao<?, ?>>… daoClasses) {

super(context, name);

mDaoClasses=daoClasses;

}

public DBUpdateOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, Class<? extends AbstractDao<?, ?>>… daoClasses) {

super(context, name, factory);

mDaoClasses=daoClasses;

}

@Override

public void onCreate(Database db) {

DaoMaster.createAllTables(db, false);

}

@Override

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

//把需要管理的数据库表DAO作为最后一个参数传入到方法中

MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {

@Override

public void onCreateAllTables(Database db, boolean ifNotExists) {

DaoMaster.createAllTables(db, ifNotExists);

}

@Override

public void onDropAllTables(Database db, boolean ifExists) {

DaoMaster.dropAllTables(db, ifExists);

}

}, mDaoClasses);

}

}

MigrationHelper.java 用于数据库升级时数据迁移

package com.zk.greendb.helper;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.text.TextUtils;

import android.util.Log;

import org.greenrobot.greendao.AbstractDao;

import org.greenrobot.greendao.database.Database;

import org.greenrobot.greendao.database.StandardDatabase;

import org.greenrobot.greendao.internal.DaoConfig;

import java.lang.ref.WeakReference;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

/**

  • 用于数据库升级时数据迁移

  • from https://github.com/yuweiguocn/GreenDaoUpgradeHelper

  • please call {@link #migrate(SQLiteDatabase, Class[])} or {@link #migrate(Database, Class[])}

*/

public class MigrationHelper {

public static boolean DEBUG = false;

private static final String TAG= MigrationHelper.class.getSimpleName();

private static final String SQLITE_MASTER = “sqlite_master”;

private static final String SQLITE_TEMP_MASTER = “sqlite_temp_master”;

private static WeakReference weakListener;

public interface ReCreateAllTableListener{

void onCreateAllTables(Database db, boolean ifNotExists);

void onDropAllTables(Database db, boolean ifExists);

}

public static void migrate(SQLiteDatabase db, Class<? extends AbstractDao<?, ?>>… daoClasses) {

printLog(“【The Old Database Version】” + db.getVersion());

Database database = new StandardDatabase(db);

migrate(database, daoClasses);

}

public static void migrate(SQLiteDatabase db, MigrationHelper.ReCreateAllTableListener listener, Class<? extends AbstractDao<?, ?>>… daoClasses) {

weakListener = new WeakReference<>(listener);

migrate(db, daoClasses);

}

public static void migrate(Database database, MigrationHelper.ReCreateAllTableListener listener, Class<? extends AbstractDao<?, ?>>… daoClasses) {

weakListener = new WeakReference<>(listener);

migrate(database, daoClasses);

}

public static void migrate(Database database, Class<? extends AbstractDao<?, ?>>… daoClasses) {

printLog(“【Generate temp table】start”);

generateTempTables(database, daoClasses);

printLog(“【Generate temp table】complete”);

MigrationHelper.ReCreateAllTableListener listener = weakListener.get();

if (listener != null) {

listener.onDropAllTables(database, true);

printLog(“【Drop all table by listener】”);

listener.onCreateAllTables(database, false);

printLog(“【Create all table by listener】”);

} else {

dropAllTables(database, true, daoClasses);

createAllTables(database, false, daoClasses);

}

printLog(“【Restore data】start”);

restoreData(database, daoClasses);

printLog(“【Restore data】complete”);

}

private static void generateTempTables(Database db, Class<? extends AbstractDao<?, ?>>… daoClasses) {

for (int i = 0; i < daoClasses.length; i++) {

String tempTableName = null;

DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);

String tableName = daoConfig.tablename;

if (!isTableExists(db, false, tableName)) {

printLog(“【New Table】” + tableName);

continue;

}

try {

tempTableName = daoConfig.tablename.concat(“_TEMP”);

StringBuilder dropTableStringBuilder = new StringBuilder();

dropTableStringBuilder.append(“DROP TABLE IF EXISTS “).append(tempTableName).append(”;”);

db.execSQL(dropTableStringBuilder.toString());

StringBuilder insertTableStringBuilder = new StringBuilder();

insertTableStringBuilder.append("CREATE TEMPORARY TABLE ").append(tempTableName);

insertTableStringBuilder.append(" AS SELECT * FROM “).append(tableName).append(”;");

db.execSQL(insertTableStringBuilder.toString());

printLog(“【Table】” + tableName +“\n —Columns–>”+getColumnsStr(daoConfig));

printLog(“【Generate temp table】” + tempTableName);

} catch (SQLException e) {

Log.e(TAG, “【Failed to generate temp table】” + tempTableName, e);

}

}

}

private static boolean isTableExists(Database db, boolean isTemp, String tableName) {

if (db == null || TextUtils.isEmpty(tableName)) {

return false;

}

String dbName = isTemp ? SQLITE_TEMP_MASTER : SQLITE_MASTER;

String sql = “SELECT COUNT(*) FROM " + dbName + " WHERE type = ? AND name = ?”;

Cursor cursor=null;

int count = 0;

try {

cursor = db.rawQuery(sql, new String[]{“table”, tableName});

if (cursor == null || !cursor.moveToFirst()) {

return false;

}

count = cursor.getInt(0);

} catch (Exception e) {

e.printStackTrace();

} finally {

if (cursor != null)

cursor.close();

}

return count > 0;

}

private static String getColumnsStr(DaoConfig daoConfig) {

if (daoConfig == null) {

return “no columns”;

}

StringBuilder builder = new StringBuilder();

for (int i = 0; i < daoConfig.allColumns.length; i++) {

builder.append(daoConfig.allColumns[i]);

builder.append(“,”);

}

if (builder.length() > 0) {

builder.deleteCharAt(builder.length() - 1);

}

return builder.toString();

}

public static void dropAllTables(Database db, boolean ifExists, Class<? extends AbstractDao<?, ?>>… daoClasses) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

分享一份NDK基础开发资料

详解:Linux网络虚拟化技术

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

板技术停滞不前!**

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-ckB9Hd8L-1712276712258)]

[外链图片转存中…(img-3IIgmiem-1712276712258)]

[外链图片转存中…(img-FCwOPtVY-1712276712259)]

[外链图片转存中…(img-5IS8BBGE-1712276712259)]

[外链图片转存中…(img-liO3kR3P-1712276712259)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

分享一份NDK基础开发资料

[外链图片转存中…(img-2nvAdZ9s-1712276712260)]

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值