Android数据库工具ORM-greenDAO学习

android GreenDao3.2 版本示例程序 android GreenDao3.2 版本示例程序,里面有相关的配置,以及示例增删改查,事务插入数据等等。我的博客地址:http://blog.csdn.net/qq_16064871 立即下载

1. 项目地址

2. 项目文档

3. 工程例子下载

4. 相关参考

GreenDao官方文档翻译

greenDaoMaster的学习研究

SQLite数据库框架ORMLite与GreenDao的简单比较

greenDAO讲义(一):使用篇

Android开源:数据库ORM框架GreenDao学习心得及使用总结

Android 数据库升级完整解决方案

greenDao Schema Upgrade

Newest greendao questions - Stack Overflow


之前没有接触过ORM概念,现在有理解了。即是一个中间层,把面向对象的操作方法转换为关系型数据库的操作。这部分不用我们去做。这样,我们可以用熟悉的、方便的面向对象的做法去操作数据库(如增删改查),避免了写不熟悉的SQL语句,避免了写重复的SQL语句。

Android上有几种ORM工具,从大牛那里推荐的是使用greenDAO,那就开始学习使用greenDAO吧。学习完成后,感觉真心不错,这种感觉更多是从编程的角度而来的,建库建表极其方便,对数据的增删改查非常容易理解和方便操作。而性能方面,网上的介绍对比greenDAO也是很出色的。

从项目的托管地址中可以下载到整个项目,整个压缩包包含了DaoCore,使用greenDAO进行数据库操作的源文件;DaoGenerator,生成中间层dao的工具源文件;以及DaoExample和DaoExampleGenerator两个例子文件夹。结合官网的文档说明、网上的介绍资料、以及两个例子文件工程,可以弄懂它的使用操作。于是,自己操作了一遍,并对此操作和遇到的问题进行下记录。

有这么一个记事本的需求,一共要建立七张表,其中表之间有一对一和一对多的关系。那么,该如何来建立呢?这个数据库建立的并不是很好,所以写生成代码的时候也适当的进行了一些小的修改,但对怎样进行建库建表还是有非常好的说明。


首先新建一个普通的Java工程,引入 freemarker.jar 和 greendao-generator.jar 两个JAR包。先获取一个Schema实例,

public Schema(int version, String defaultJavaPackage)
构造方法的第一个参数是版本号,和用原生的数据库操作类的版本号是对应的,第二个是生成的包名。

	public static void main(String[] args) {
		Schema schema = new Schema(VERSION, "com.example.notepad.databasedao");
		createTable(schema);
	}

有了Schema,就可以获得一个Entity实体,这个实体相对于一张数据表。它的解释很明了:

/*
Model class for an entity: a Java data object mapped to a data base table. A new entity is added to a Schema by the method Schema.addEntity(String) (there is no public constructor for Entity itself). 

*/

有了Entity实例,就可以开始生成字段属性了。生成的方法很简单,就是进行一系列的 add***Property 方法的调用。生成的名字的规则是全部使用大写,在添加的字段名中用下划线来替代骆驼命名。比如,下面的代码就生成了用户表:

	//建立用户表
		Entity user = schema.addEntity("User");
		Property user_username = user.addStringProperty("username").notNull().primaryKey().getProperty();
		user.addStringProperty("password").notNull();
		user.addStringProperty("email");

对于生成的建表代码如下:

    public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
        String constraint = ifNotExists? "IF NOT EXISTS ": "";
        db.execSQL("CREATE TABLE " + constraint + "'USER' (" + //
                "'USERNAME' TEXT PRIMARY KEY NOT NULL ," + // 0: username
                "'PASSWORD' TEXT NOT NULL ," + // 1: password
                "'EMAIL' TEXT);"); // 2: email
    }

大多数情况下,我们需要自己指定字段属性的类型,那我们可以这样做,以建立用户笔记表为例:

		//建立用户笔记表
		Entity userNote = schema.addEntity("UserNote");
		Property note_noteId = userNote.addLongProperty("noteId").primaryKey().autoincrement().getProperty();
		userNote.addIntProperty("noteType").notNull().columnType("tinyint");
		Property note_categoryId = userNote.addLongProperty("categoryId").notNull().getProperty();
		userNote.addIntProperty("boolPrivate").notNull().columnType("tinyint");
		Property note_username = userNote.addStringProperty("username").columnType("varchar(20)").getProperty();

这样我们就自己指定了字段的类型为 tinyint 、varchar(20)、或者指定其它的类型。那么如何添加外键约束呢,表示一对一、一对多的关系呢?这里要说明的是,它并不生成实际的sql外键约束语句,即不是物理的外键约束,只是概念上的外键约束。实现这种关系,对于获取数据是非常方便的。比如,一条笔记对应于一条笔记详细项,

		//一条笔记对应一条笔记详细项
//		userNote.addToOne(userNoteItem, item_noteId);	//错误,会生成错误的代码,要重读文档是如何写的
		userNote.addToOne(userNoteItem, note_noteId);

那我们获得一条笔记时,可以方便的获得笔记的详细项:

	/**
	 * 返回笔记的详细项
	 * @param userNote
	 * @return
	 */
	public UserNoteItem queryUserNoteItems(UserNote userNote) {
		UserNoteItem item = userNote.getUserNoteItem();
		
		log("笔记详细项:" + item.toString());
		
		return item;
	}

再比如,一条笔记对应于一个类别,

		//一条笔记对应一个类别,一对一的关系
		userNote.addToOne(userCategory, note_categoryId, "category");

当我们想知道该类别的信息时,可以这样做:

		UserNote userNote = ...
		UserCategory category = userNote.getCategory();

实现一对多的关系,同样是很方便的和值得做的。比如,一个用户对应于多个类别,

		//一个用户可以有多个类别,一对多关系		
		ToMany userToUserCategory = user.addToMany(userCategory, categoroy_username);
//		userToUserCategory.setName("categorys");
		userToUserCategory.orderAsc(categoryId);

其中,addToMany()的重载方法中,有个name的参数,这是设置get方法的Name,因为对于关系中可能会发生重复;或者单独使用 setName 方法来进行设置。同样,我们可以进行排序处理。

获取到一个用户的实例后,想查看该用户建立的所有类别,可以这样做:

	
	/**
	 * 查询一个用户的全部类别
	 * @param user
	 * @return
	 */
	public List<UserCategory> queryUserCategorys(User user ) {
		return user.getUserCategoryList();
	}

真是太方便了。

其它的数据表同样的操作,最后,我们要触发生成这些文件:

			DaoGenerator daoGenerator = new DaoGenerator();
			daoGenerator.generateAll(schema, "../GreenDAOLearn/src-gen");

我们先要在工程目录下新建工程文件GreenDAOLearn,并新建source folder文件夹src-gen即可。

这样,我们就完成了建表的任务。接下来,看看如何进行增删改查。

我们先看初始化的工作:获得一个DevOpenHelper对象,该对象继承抽象类OpenHelper,OpenHlper继承我们熟悉的SQLiteOpenHelper,然后获得一个SQLiteDatabase对象,接着得到DaoMaster和DaoSession对象,得到DaoSession就可以方便的获得各个实体类的DAO方法类。其中上述对象的关系可以参考这里。当然,文档上推荐的是使用单例模式,把DaoSession保存到 ApplicationContext中。

	private DBManager(Context context) {
		if (mDaoSession == null ) {
			DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(context.getApplicationContext(), "notes-db", null);
			mDb = devOpenHelper.getWritableDatabase();
			mDaoSession = new DaoMaster(mDb).newSession();
		}
		
	}
	
	public static synchronized DBManager getInstance(Context context ) {
		if (mInstance == null ) {
			mInstance = new DBManager(context);
			mContext = context;
		}
		
		QueryBuilder.LOG_SQL = true;
		QueryBuilder.LOG_VALUES = true;
		
		return mInstance;
	}

①增加

我们看如何添加一个用户:

	public void addUser(String username, String password, String email ) {
		User user = new User(username, password, email);
		UserDao userDao = mDaoSession.getUserDao();
		userDao.insert(user);
		log("Inserted new user: username:"+user.getUsername()+", password:"+user.getPassword()+", email:"+user.getEmail());
	}

或者如何添加一条笔记:

	public void addUserNote(int noteType, long categoryId, int boolPrivate, String title, String content, String linkUri, 
			Date mdate, byte[] mdata, int commentsCount, String username ) {
		
		UserNoteDao userNoteDao = mDaoSession.getUserNoteDao();
		UserNote userNote = new UserNote();
		userNote.setCategoryId(categoryId);
		userNote.setBoolPrivate(boolPrivate);
		userNote.setUsername(username);
		userNoteDao.insert(userNote);
		
		long noteId = userNote.getNoteId();
		
		log("Add a UserNote");
		log("noteId:"+noteId);
		
		UserNoteItemDao userNoteItemDao = mDaoSession.getUserNoteItemDao();
		UserNoteItem userNoteItem = new UserNoteItem(noteId, title, content, linkUri, mdate, mdata, commentsCount, username);
		userNoteItemDao.insert(userNoteItem);
		
		log("Add a UserNoteItem");
		
		
	}

②删除

删除一个类别,由主键指定:

	public void deleteCategory(Long categoryId ) {
		UserCategoryDao userCategoryDao = mDaoSession.getUserCategoryDao();
		userCategoryDao.deleteByKey(categoryId);
		
		log("Delete a category");
	} 

删除一个类别,由其它字段指定:

	public void deleteCategory(String categoryName ) {
		UserCategoryDao userCategoryDao = mDaoSession.getUserCategoryDao();
		QueryBuilder<UserCategory> qb =  userCategoryDao.queryBuilder();
		DeleteQuery<UserCategory> bd = qb.where(Properties.CategoryName.eq(categoryName)).buildDelete();
		bd.executeDeleteWithoutDetachingEntities();
		
		log("Delete a category.");
	}

删除一个用户:

	public void deleteUser(String username ) {
		UserDao userDao = mDaoSession.getUserDao();
		userDao.deleteByKey(username);
		log("Delete a user: username:"+username);
	}

③更新

更新的方法有两种,一种是用update语句,如果没有存在相应的数据将会出错;另一种是之前没有接触过的,好像是sqlite的特点之一,即是 insert or replace into 语句,如果不存在则插入,如果存在就更新。

更新用户的信息:

	public void updateUser(User user ) {
		UserDao userDao = mDaoSession.getUserDao();
		userDao.update(user);
	}

插入或更新用户的信息:

	public void updateUser(String username, String password, String email ) {
		UserDao userDao = mDaoSession.getUserDao();
		userDao.insertOrReplace(new User(username, password, email));
		
	}

④查询

我们可以方便的用主键来加载一个实体信息(一条信息),我们看加载一个用户:

	public User loadUser(String username ) {
		UserDao userDao = mDaoSession.getUserDao();
		return userDao.load(username);
	}

文档推荐使用QueryBuilder来构建条件语句,比如查询笔记中类别id为1的所有笔记,where的参数可以使用类似如下的方式构建,

List<UserNote> list2 = userNoteDao.queryBuilder().where(UserNoteDao.Properties.CategoryId.eq(1)).list();

文档的例子如下:

QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("Joe"),
qb.or(Properties.YearOfBirth.gt(1970),
qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
List youngJoes = qb.list();

如果返回的结果是唯一的,可以如下使用,当不存在时返回为空:

User user = userDao.queryBuilder().where(UserDao.Properties.Username.eq(username)).unique();

我们可以自己写条件语句:

Query query = userDao.queryBuilder().where(new WhereCondition.StringCondition("sql condition")).build();

文档上的例子如下:

Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " +
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();

或者,

Query query = userDao.queryRawCreate(
  ", GROUP G WHERE G.NAME=? AND T.GROUP_ID=G._ID", "admin");

这个用法是自己写接在select 和 实体(table)后面的语句,具体怎样没有去试验,文档的解释也很清楚:

<q>In case QueryBuilder does not provide the feature you need (e.g. joins), you can fall back to one of the queryRaw or queryRawCreate methods. They allow you to pass a raw SQL string, which is appended after the SELECT and the entities columns. This way, you can have any WHERE and ORDER BY clause you want to select entities. The entity table can be referred using the alias “T”<q>

我们在查询中,通常是取出一定量的数据,而不是一下子全部取出来,那该如何实现呢,看个例子,取出5条类别id为1的的笔记,偏移量为5,这个我们很熟悉:

List<UserNote> list = userNoteDao.queryBuilder().where(UserNoteDao.Properties.CategoryId.eq(1)).offset(5).limit(5).list();

查询中,我们可能要使用到递增还是递减,我们看文档中的例子:

List joes = userDao.queryBuilder()
.where(Properties.FirstName.eq("Joe"))
.orderAsc(Properties.LastName)
.list();

到这里,我们可以使用greenDAO来方便我们的开发了。但还有问题没有解决。使用起来不放心。一个是数据库版本更新的问题,一个是事务操作的问题。

数据库版本更新的问题需要我们在生成的文件中自己手动进行修改。greenDAO的维护团队greenrobot也在stackoverflow中回答说目前并没有支持自动生成。我们看生成的文件DaoMaster.java 中的这段代码:

    /** WARNING: Drops all table on Upgrade! Use only during development. */
    public static class DevOpenHelper extends OpenHelper {
        public DevOpenHelper(Context context, String name, CursorFactory factory) {
            super(context, name, factory);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
            dropAllTables(db, true);
            onCreate(db);
        }
    }

我们可以在回调函数onUpgrade中进行我们自己的升级策略。具体的维护策略和如何操作可以参考 这里,和 这里。

事务操作可以对大量的数据操作进行优化,以及在另一方面保持数据的同步性。greenDAO提供了几种事务操作的方法,比如对同一类型的操作进行大量的处理,它提供了类似如下的方法: 

		try {
			userDao.insertInTx(new User("abc13", "123456", "12@qq.com"), new User("abc8", "123456", "12@qq.com"),new User("abc14", "123456", "12@qq.com"));
		} catch (Exception e) {
			log("执行失败-insertInTx");
			e.printStackTrace();
		}

同样的,我们可以这样进行事务处理:

		//事务
		try {
			mDaoSession.runInTx(new Runnable(){

				@Override
				public void run() {
						int size = userDao.loadAll().size();
						log("user size is " + size);
						userDao.insert(new User("abc20", "123456", "abc@qq.com"));
						userDao.insert(new User("abc21", "123456", "abc@qq.com"));
						userDao.insert(new User("abc4", "123456", "abc@qq.com"));
						userDao.insert(new User("abc22", "123456", "abc@qq.com"));
						size = userDao.loadAll().size();
						log("user size is " + size);				
				}});
		} catch (Exception e1) {
			log("执行失败-runInTx");
			e1.printStackTrace();
		}

run()方法里面跑的就是一系列的sql操作语句,我们可以查看其中的源码,更方便理解:

    /**
     * Run the given Runnable inside a database transaction. If you except a result, consider callInTx.
     */
    public void runInTx(Runnable runnable) {
        db.beginTransaction();
        try {
            runnable.run();
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }

一开始,我写出如下的方式,结果事务不能回滚,这当然是非常大的错误,如果结合源码分析,则可以很快的发现我的错误,我把Exception在里边捕获了,db.setTransactionSuccessful()总是会执行,当然不会回滚。

			//事务,错误的写法
			mDaoSession.runInTx(new Runnable(){

				@Override
				public void run() {
						try {
							int size = userDao.loadAll().size();
							log("user size is " + size);
							userDao.insert(new User("abc20", "123456", "abc@qq.com"));
							userDao.insert(new User("abc21", "123456", "abc@qq.com"));
							userDao.insert(new User("abc4", "123456", "abc@qq.com"));
							userDao.insert(new User("abc22", "123456", "abc@qq.com"));
							size = userDao.loadAll().size();
							log("user size is " + size);
						} catch (Exception e) {
							e.printStackTrace();
						}				
				}});

这样,我们就可以较放心的使用这个工具。我们可以获取SQLiteDatabase对象来进行一些greenDAO没有提供的操作,这要写原始的SQL语句。我们在调试的时候,要打开两个选项,这样就可以观察到构建的SQL语句:

	public static synchronized DBManager getInstance(Context context ) {
		if (mInstance == null ) {
			mInstance = new DBManager(context);
			mContext = context;
		}
		
		QueryBuilder.LOG_SQL = true;
		QueryBuilder.LOG_VALUES = true;
		
		return mInstance;
	}



android -orm框架 支持android 嵌入式数据库sqlite3 数据库的增删改查,方便自己扩展 运行sql语句 立即下载

相关推荐

STM32F103C8T6通过ESP8266连接阿里云物联网平台(附代码)

STM32F103C8T6连接阿里云物联网平台(1)—阿里云lot Studio控制 Web开发 分享一下自己使用stm32f103c8t6通过ESP_01模块连接阿里云物联网平台,实现温湿度上传和控制命令下达的过程,能力有限,用的是最简单的方法,如有错误,多多担待。 一、硬件选型 1、 stm32f103c8t6 2、ESP_01 wifi模块 3、其他 二、硬件连接 WSP_01 STM32F103C8T6 RXD PA2 TXD PA3 RES PA4 VCC 3.3

weixin_A13253323604 3万+

Hadoop常用的HBase操作

《大数据技术原理与应用》 上机练习 熟悉常用的HBase操作 目录 1 作业题目... 1 2 作业目的... 1 3 作业性质... 1 4 作业考核方法... 1 5 作业...

Sing___546的博客 3536

5G NR切换测量事件解析:从A1到B2的实战应用指南

本文深入解析5G NR切换测量事件,从A1到B2的实战应用指南。详细介绍了系统内切换事件(A1-A6)和系统间切换事件(B1-B2)的触发条件与配置建议,帮助优化网络性能。通过实际案例分享,展示如何调整参数提升切换成功率和降低乒乓切换率,适用于5G网络优化工程师。

tcp8optimizer的博客 512

GreenDao常用操作(二)

1.导入GreenDao 2.根据字段自动生成表结构以及相关操作类 3.创建工具类对数据库增删改查

DB.Cloud的专栏 1424

3D视觉革命丨多相机协同拼接技术如何重塑工业检测边界

本文深入探讨了多相机协同拼接技术如何突破单台3D相机的物理局限,实现工业检测从“点面”到“立体”的无死角覆盖。通过拆解系统标定、同步融合等核心技术,并结合锂电池、长轴零件等实战案例,揭示了该技术如何以虚拟“超级视觉传感器”重塑检测边界,提升精度与效率。

weixin_29056865的博客 387

25、量子计算:中性原子与约瑟夫森结量子比特

本文详细探讨了中性原子和约瑟夫森结两种量子比特在量子计算中的应用。中性原子量子比特利用光晶格实现量子态的操控,具有长相干时间的优势,但面临可扩展性和多量子比特操作的挑战;而约瑟夫森结量子比特基于超导技术,结合半导体制造工艺,具有低耗散和潜在的高可扩展性,但在参数控制和环境干扰方面存在难题。文章还比较了这两种方案的性能、应用场景及未来发展趋势,展望了它们在量子计算发展中的潜力与突破方向。

ol789012的博客 212

GreenDao 多表操作事务管理

场景:Android APP多表操作事务管理 使用Android自带的sql操作类操作的时候需要手动处理事务,使用GreenDao的时候不用管了,啥都处理好了。但是,如果是多表操作的话,怎么统一管理事务? 关键思想是事务嵌套,具体方法使用: DaoSession().callInTx() 看源码可以知道callInTx里面有一层事务管理,实际调用insert、update之类的具体方法的时候,里面还有一层事务。进行事务嵌套后,只要内层的事务有一个操作失败,最外层的事务就认为整个事务都失败,其他操

u010227042的博客 1127

评估篇| 大模型评测综述

1、基于人类的评测。与针对基础大语言模型的自动化评测不同,微调大语言模型的评测更加注重模型在实际应用场景中的表现,如与人类交互的自然度、对齐度等。2、基于模型的评测。例如,AlpacaEval 排行榜 基于由大语言模型合成的人类需求指令作为评测任务,然后收集待评估大模型的回应,并采用 GPT-4 等大语言模型作为评测员,将待评估大语言模型的输出与参考输出进行成对比较。1、大语言模型对评估设置极为敏感,包括问题的表述方式、提示样本的选择以及答案的解析策略等,这些细微的差别都可能导致评估结果的显著变化。

youbingchen的博客 636

GreenDao数据库框架 最精简使用教程 并对其进行简单封装

GreenDao框架的使用步骤:(android studio)1.首先在project的build.gradle下进行添加如下依赖:dependencies { classpath 'org.greenrobot:greendao-gradle-plugin:3.1.1' } 2.然后在Module的build.gradle下添加如下: sourceSets{ main{

张哲伟的博客 3815

深度学习驱动的股票波动率预测:LSTM和Transformer模型的实战解析

股票市场的波动率一直是金融领域关注的焦点之一。波动率预测对于风险管理、期权定价和资产配置至关重要。深度学习模型,如长短时记忆网络(LSTM)和Transformer,已经在时间序列数据分析领域取得了显著的成就。本博客将向您展示如何使用这两种深度学习模型来进行股票波动率预测,提供清晰的思路和相应的Python代码,以帮助您理解和应用这一重要任务。

斌擎科技 974

示波器核心参数选型指南:带宽、采样率与嵌入式调试实战

示波器是电子工程师进行信号观测与故障诊断的基础仪器,其性能由带宽、采样率、通道数、存储深度、触发系统和探头特性共同决定。带宽定义高频响应边界,需遵循5倍法则以保障数字信号上升沿测量精度;采样率则依据奈奎斯特定理并结合工程冗余(通常≥2.5×带宽)实现可靠时域重建。二者协同影响信号完整性评估能力,尤其在UART、I²C、SPI等嵌入式总线调试中至关重要。高存储深度支持长时捕获与毛刺定位,智能触发与硬件协议解码进一步将波形分析升维至语义级。本文围绕真实嵌入式场景,解析参数间的耦合关系与典型误用陷阱。

weixin_42588877的博客 91

GreenDAO操作数据库总结

自定升级逻辑 GreenDao有做一个DevOpenHelper来处理创建和升级数据库的逻辑,但在升级里的处理是删除table重新创建,导致数据库已存在的用户数据丢失。 参考DevOpenHelper的实现自定义DownloadDBHelper,自定义升级逻辑。 在android数据库模块,新增的列可以通过alter语句做到,但要删除一列时通过drop却不行。 现在是通过整张表的复制实现的,先创建一张和当前的表一样的临时表,数据都在临时表中,将当前的表删除,创建一张新的表(当前我们期望的表),将数据从临时表

little little 382

22、计算智能在自闭症检测与管理中的应用

本文探讨了计算智能在自闭症谱系障碍(ASD)检测与管理中的应用。在检测方面,结合可穿戴设备、传感技术与多模态数据(如眼动追踪、问卷、神经成像等),利用机器学习和深度学习算法提升诊断准确性,并介绍了多种公开数据集及研究方法。在管理方面,通过生理指标(HRV、GSR、呼吸频率)监测情绪状态,结合智能可穿戴设备与支持性应用平台(如LetMeTalk、MITA、Rethink Ed等),实现对ASD患者的实时干预与个性化支持。文章还展示了多模态筛查与管理流程的系统架构,强调未来技术整合与个性化服务的发展方向。

star的博客 91

【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结 转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化。由于项目里涉及了大量的缓存处理和数据库运...

God20091111的博客 203

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android开源:数据库ORM框架GreenDao学习心得及使用总结

最近在对开发项目的性能进行优化。由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读写、查询等操作。因此首先想到了对整个项目的数据库框架进行优化。    原先使用android本身内置的sqllite,也就是用的最基本的SQLiteOpenHelper方法,这种方法对自己来说比较方便易懂。但是在使用过程中感觉很繁琐,从建表到对表的增删改查等操作,如果表对象的属性很多,就需要使

努力后才会有收获....加油! 1990

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android开源:数据库ORM框架GreenDao学习(一)基础使用篇

转载地址:http://www.open-open.com/lib/view/open1438065400878.html 前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、Sug

夜空中最亮的星 987

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SQL学习笔记之数据库专题(三):Android下Sqlite数据库ORM框架之GreenDao详解

在大型项目中,android的数据库操作不可能再像第二篇文章那样,用最基础的API去实现各方面的操作,那样效率会十分的底下。那么,在android开发中,提拱了androrm,Ormlite,greenDao三个主流框架,博主三生有幸,再开发第一个项目的时候,就被逼着学习使用greenDao这个ORM框架。现在回过头看,greenDao似乎是三种框架中效率最高的,但是对于初学者来说,使用起来非常的

victorfreedom的专栏 4185
上一篇: Android组件Volley学习
下一篇: 学习笔记快速记录
xiongmaozhijin
博客等级 码龄15年 4粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值