Android room 简单入门实战
1.关于room
room是google官方开发的对象关系映射(ORM)库框架,采用注解的方式,让你访问数据库更加稳健,提升数据库性能。
- 官网说明
- 中文翻译指南
- 官方案例
2.导入room
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
3.实现数据库操作的步骤
1. 必须先创建一个需要映射的实体类,用@Entity进行注解
@Entity
public class Anime {/*** 动漫名* 如果是字符串做主键,记得加@NonNull,不然会报错*/@NonNull@PrimaryKeyprivate String name;/*** 动漫类型*/private String type;/*** 放送时间*/private String playDate;/*** 集数*/private int episode;getter、setter省略...
}
2. 创建一个操作实体类的dao接口,用@Dao进行注解
@Dao
public interface AnimeDao {@Query("SELECT * FROM anime")List<Anime> getAllAnime(); //加载所有动漫数据@Query("SELECT * FROM anime WHERE name = :name")Anime loadAnimeByName(String name); //根据名字加载动漫@Insertvoid insertOneAnime(Anime anime); //插入一条动漫信息@Insertvoid insertMultiAnimes(Anime... animes); //插入多条动漫信息@Update(onConflict = OnConflictStrategy.REPLACE)int updateUsers(Anime... animes); //更新动漫信息,当有冲突时则进行替代@Deletevoid deleteAnime(Anime anime);
}
3. 创建一个抽象类,添加@Database注解
@Database(entities = {Anime.class},version = 1)
public abstract class AppDatabase extends RoomDatabase {public abstract AnimeDao animeDao();
}
4. 创建RoomDatabase实例,在application中初始化,建议是单例
public class MyApp extends Application {private static MyApp mInstance;private AppDatabase appDB;@Overridepublic void onCreate() {super.onCreate();mInstance = this;appDB = Room.databaseBuilder(this,AppDatabase.class,"anime_info").addMigrations().build();}public static MyApp getInstance(){return mInstance;}public AppDatabase getAppDB(){return appDB;}}
4.操作数据库进行增删改查
增
animeDao.insertOneAnime(createOneAnime());
删
animeDao.deleteAnime(queryOneRecord());
改
Anime anime = queryOneRecord();anime.setEpisode(100);animeDao.updateUsers(anime);
查
private Anime queryOneRecord() {Anime anime = animeDao.loadAnimeByName("青春猪头少年不会梦到兔女郎学姐");tvResult.setText(anime.toString());return anime;}
5.异常报错
- 实体类定义中没有加NonNull,因为它是字符串主键,为避免其为空,所以必须加上此限制
You must annotate primary keys with @NonNull. "name" is nullable. SQLite considers this a bug and Room does not allow it. See SQLite docs for details:
- 不允许在主线程中操作数据库,可在构建RoomDatabase实例对象中,加入
allowMainThreadQueries()
,这是默认不许在主线程中连接数据库。
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
变成这样即可
appDB = Room.databaseBuilder(this,AppDatabase.class,"anime_info").addMigrations().allowMainThreadQueries().build();
6.查看数据库
用SQLite Expert Personal 3打开刚创建并进行操作过的数据库,看是否正常。
打开第一个文件anime_info,注意这里在构建RoomDatabase实例时没加后缀db,所以看到的文件也没有db后缀。
可以看到数据库表正确地创建了,数据也有写入。
最后,附上界面图和activity代码,写的很粗糙,多次点击会崩溃,因为有冲突发生时是以异常形式处理的,更深层次的应用有机会再写。
package cn.pigdreams.blogdemo.roomdemo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import java.util.List;import cn.pigdreams.blogdemo.MyApp;
import cn.pigdreams.blogdemo.R;public class RoomDemoActivity extends AppCompatActivity implements View.OnClickListener {private Button button;private Button button2;private Button button3;private Button button4;private Button button5;private Button button6;private TextView tvResult;private AnimeDao animeDao;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_room_demo);button = findViewById(R.id.button);button2 = findViewById(R.id.button2);button3 = findViewById(R.id.button3);button4 = findViewById(R.id.button4);button5 = findViewById(R.id.button5);button6 = findViewById(R.id.button6);tvResult = findViewById(R.id.tv_result);button.setOnClickListener(this);button2.setOnClickListener(this);button3.setOnClickListener(this);button4.setOnClickListener(this);button5.setOnClickListener(this);button6.setOnClickListener(this);//拿到数据库操作对象animeDao = MyApp.getInstance().getAppDB().animeDao();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button://增加一条动漫记录animeDao.insertOneAnime(createOneAnime());break;case R.id.button2://删除一条记录animeDao.deleteAnime(queryOneRecord());queryAllRecord();break;case R.id.button3://更新一条记录updateRecord();break;case R.id.button4://查询所有记录queryAllRecord();break;case R.id.button5://增加多条动漫记录animeDao.insertMultiAnimes(createMutilAnime());break;case R.id.button6://查询一条记录queryOneRecord();break;}}private void updateRecord() {Anime anime = queryOneRecord();anime.setEpisode(100);animeDao.updateUsers(anime);queryAllRecord();}private Anime queryOneRecord() {Anime anime = animeDao.loadAnimeByName("青春猪头少年不会梦到兔女郎学姐");tvResult.setText(anime.toString());return anime;}private void queryAllRecord() {List<Anime> animeList = animeDao.getAllAnime();tvResult.setText(animeList.toString());}private Anime createOneAnime(){Anime anime = new Anime();anime.setName("青春猪头少年不会梦到兔女郎学姐");anime.setType("奇幻&恋爱");anime.setPlayDate("2018-10");anime.setEpisode(13);return anime;}private Anime[] createMutilAnime(){Anime[] animes = new Anime[3];Anime anime = new Anime();anime.setName("超能力女儿");anime.setType("魔幻日常");anime.setPlayDate("2018-4");anime.setEpisode(12);Anime anime1 = new Anime();anime1.setName("卫宫家今天的饭");anime1.setType("美食");anime1.setPlayDate("2018-1");anime1.setEpisode(13);Anime anime2 = new Anime();anime2.setName("终将成为你");anime2.setType("百合");anime2.setPlayDate("2018-10");anime2.setEpisode(13);animes[0] = anime;animes[1] = anime1;animes[2] = anime2;return animes;}
}
Android room 简单入门实战相关推荐
- android php实战,android编程开发入门实战例子–hello word
android开发入门实战编程例子–hello word 1.打开Eclipse,选择菜单File->New->Other,打开新建对话框.选择Android Project后,点击Nex ...
- webService简单入门实战(一)
目录 背景 绪论 依赖 接口 实现 服务端 客户端 运行 彩蛋 背景 首先谈论一下webService这个专栏的诞生吧!最近由于工作方面的原因,慢慢自己工作时间非常的"充沛",整体 ...
- 5G 时代的 Android App 开发入门与项目实战
随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...
- 《Android App开发入门与项目实战》出版后记
<Android Studio开发实战:从零基础到App上线>自面世以来,承蒙众多朋友的抬爱,该书一直保持不错的销量,其中第一版的出货量突破一万,第二版的出货量即将突破两万.对于一个程序员 ...
- android开发入门与实践_我的新书《Android App开发入门与实战》已经出版
前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...
- (超多图)基于Android studio开发的一个简单入门小应用(超级详细!!)(建议收藏)
基于Android studio开发的一个简单入门小应用 一.前言 二.前期准备 三.开发一个小应用 五.运行应用 一.前言 在暑假期间,我学习JAVA基础,为了能早日实现自己用代码写出一个app的& ...
- Android 开发从入门到实战
第1章 Android开发环境搭建 本章介绍了如何在个人电脑上搭建Android开发环境,主要包括:Android开发的发展历史是怎样的. Android Studio的开发环境是如何搭建的.如何创建 ...
- 亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像)
亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像) 大噶好,我们继续延续上一章,学习如何使用OSS存放用户头像代码示例; 在application.propert ...
- 我的新书《Android App开发入门与实战》已经出版
文章目录 1. 前言 2. 写书的目的 3. 书籍简介 4. 书籍目标读者群体 5. 书籍比较 6. 书籍特色 7. 书籍章节 8. 书籍封面 9. 购书地址 10. 本书案例及源码下载 1. 前言 ...
最新文章
- 好雨云帮近期问答集锦(1.16~2.5)
- 阿联酋的科技野心:AI或将成为新“石油”
- vue html5模板,vue-h5-template
- python编写脚本方法_python 定时器,实现每天凌晨3点执行的方法
- mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
- POJ 3050 Hopscotch
- Happy Birthday to You
- yii2 restful的自定义api
- 微信公众号H5游戏平台完整源码放送给大家
- The NMEA 0183 Protocol
- dataformatstring(DataFormatString 文本)
- java流水号_java怎样自动生成流水号
- 操作系统的位数决定寻址空间
- 利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分
- 计算机与音乐整合的教学设计,信息技术与学科教学整合音乐课教学设计 2010年10月 田赞禄...
- 一本应届毕业生求职经历+心得小结
- 使用计算机制作数字文本结构 可以,使用计算机制作的数字文本结构,可以分为线性结构与非线性结构,简单文本呈现为一种结构,写作和阅读均按顺序进行。(1.0分)...
- Android性能优化--IO 优化( IO基本知识:应用程序、文件系统和磁盘,三种IO方式及适用场景,多线程阻塞IO和NIO)
- 赖世雄老师---不完全不及物动词---become/turn/get/seem及感官动词
- 关键点检测——68点图例