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 简单入门实战相关推荐

  1. android php实战,android编程开发入门实战例子–hello word

    android开发入门实战编程例子–hello word 1.打开Eclipse,选择菜单File->New->Other,打开新建对话框.选择Android Project后,点击Nex ...

  2. webService简单入门实战(一)

    目录 背景 绪论 依赖 接口 实现 服务端 客户端 运行 彩蛋 背景 首先谈论一下webService这个专栏的诞生吧!最近由于工作方面的原因,慢慢自己工作时间非常的"充沛",整体 ...

  3. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  4. 《Android App开发入门与项目实战》出版后记

    <Android Studio开发实战:从零基础到App上线>自面世以来,承蒙众多朋友的抬爱,该书一直保持不错的销量,其中第一版的出货量突破一万,第二版的出货量即将突破两万.对于一个程序员 ...

  5. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版

    前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...

  6. (超多图)基于Android studio开发的一个简单入门小应用(超级详细!!)(建议收藏)

    基于Android studio开发的一个简单入门小应用 一.前言 二.前期准备 三.开发一个小应用 五.运行应用 一.前言 在暑假期间,我学习JAVA基础,为了能早日实现自己用代码写出一个app的& ...

  7. Android 开发从入门到实战

    第1章 Android开发环境搭建 本章介绍了如何在个人电脑上搭建Android开发环境,主要包括:Android开发的发展历史是怎样的. Android Studio的开发环境是如何搭建的.如何创建 ...

  8. 亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像)

    亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像) 大噶好,我们继续延续上一章,学习如何使用OSS存放用户头像代码示例; 在application.propert ...

  9. 我的新书《Android App开发入门与实战》已经出版

    文章目录 1. 前言 2. 写书的目的 3. 书籍简介 4. 书籍目标读者群体 5. 书籍比较 6. 书籍特色 7. 书籍章节 8. 书籍封面 9. 购书地址 10. 本书案例及源码下载 1. 前言 ...

最新文章

  1. 好雨云帮近期问答集锦(1.16~2.5)
  2. 阿联酋的科技野心:AI或将成为新“石油”
  3. vue html5模板,vue-h5-template
  4. python编写脚本方法_python 定时器,实现每天凌晨3点执行的方法
  5. mybatis报错Type interface xxx.Dao is not known to the MapperRegistry
  6. POJ 3050 Hopscotch
  7. Happy Birthday to You
  8. yii2 restful的自定义api
  9. 微信公众号H5游戏平台完整源码放送给大家
  10. The NMEA 0183 Protocol
  11. dataformatstring(DataFormatString 文本)
  12. java流水号_java怎样自动生成流水号
  13. 操作系统的位数决定寻址空间
  14. 利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分
  15. 计算机与音乐整合的教学设计,信息技术与学科教学整合音乐课教学设计  2010年10月  田赞禄...
  16. 一本应届毕业生求职经历+心得小结
  17. 使用计算机制作数字文本结构 可以,使用计算机制作的数字文本结构,可以分为线性结构与非线性结构,简单文本呈现为一种结构,写作和阅读均按顺序进行。(1.0分)...
  18. Android性能优化--IO 优化( IO基本知识:应用程序、文件系统和磁盘,三种IO方式及适用场景,多线程阻塞IO和NIO)
  19. 赖世雄老师---不完全不及物动词---become/turn/get/seem及感官动词
  20. 关键点检测——68点图例

热门文章

  1. 计算机游戏 25攻略,我的咖啡厅25级攻略大全及游戏技巧详解
  2. 图解 偏向锁,轻量锁,重量锁
  3. 手机PDF阅读器的功能有哪些
  4. 我不厉害,只是走上了发展的快车道
  5. android 12306反编译,Android开发(七)| “我的12306”实例
  6. 达内java学习day1
  7. 计算机游戏50关,最囧游戏50关怎么过 最囧游戏第50关
  8. Quartus-原理图文件转换Verilog语言文件
  9. 嵌入式实习ing(一)
  10. 华南农业大学java_华南农业大学 JAVA期末试卷及最新考试复习重点.doc