安卓& Kotlin Books 在Android上保存数据

8
DAO模式 由Aldo Olivares撰写

在上一章中,您了解了不同类型的关系,如 一对一, 一对多多对多。您还学习了如何使用注释创建它们。

现在,您将学习如何使用数据库中检索,插入,删除和更新数据 数据库访问对象.

一路上,您还将学习:

  • 什么是他们是什么以及他们的工作方式。
  • 如何使用房间注释创建DAOS。
  • 如何使用提供程序类预先填充数据库。
  • 如何表演 插入 queries using @Insert annotated methods.
  • 如何表演 删除 queries using @Deleteannotated methods.
  • How to use the @Query annotation, to read data from the database.

准备好?潜入!

入门

下载本章附加的Starter项目,然后使用它打开 安卓Studio 3.4 或以上。一旦Gradle完成建立您的项目,需要一些时间来熟悉代码。如果您一直在关注,则应该熟悉该项目,因为它与上一章中的最终项目相同。如果您刚刚入门,这是代码的快速回顾:

  • 数据 包包含两个包: D b 模型。这 D b package contains the QuestionDatabase class, which defines your Room database. The 模型 package contains your entities: QuestionAnswer.
  • 看法 package contains all your activities: MainActivity, QuestionActivity 和 the ResultActivity.

现在 建造 跑步 要验证一切正常工作的应用程序:

凉爽的!现在,您已准备好开始创建某些数据库访问对象以便操纵数据。

使用DAO查询您的数据

数据库访问对象通常被称为 骗子 。 DAOS是提供对应用程序数据访问权限的对象,它们是如此强大的备用空间,因为它们摘要大多数传播到实际数据库的复杂性。使用DAOS而不是查询构建器或直接查询使其非常容易与您的数据库交互。如果休息,你避免了调试查询建设者的所有困难,我们都知道SQL的棘手了!他们也提供了更好的 关注点分离 创建更具结构化应用程序并提高其可测试性。

@Dao
interface QuizDao {
}
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(question: Question)

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(answer: Answer)
@Query("删除 questions")
fun clearQuestions()
@Delete
fun deleteQuestion(question: Question)
@Query("SELECT * FROM questions ORDER BY question_id") // 1
fun getAllQuestions(): List<Question>

@Transaction // 2
@Query("SELECT * FROM questions") // 3
fun getQuestionAndAllAnswers(): List<QuestionAndAllAnswers>
abstract fun quizDao(): QuizDao
@Database(
    entities = [(Question::class), (Answer::class)],
    version = 1
)
abstract class QuizDatabase : RoomDatabase() {

    abstract fun quizDao(): QuizDao
}

创建提供商类

NOWS Dao Metho Methos已准备就绪,您将创建Createer Clave Clasr Class并预先填充您的数据库。在下面创造一个新的课程 数据 包,名称它 调查infoprovider. 并添加以下方法:

private fun initQuestionList(): MutableList<Question> {
  val questions = mutableListOf<Question>()
  questions.add(
      Question(
          1,
          "Which of the following languages is not commonly used to develop Android Apps")
  )
  questions.add(
      Question(
          2,
          "What is the meaning of life?")
  )
  return questions
}
private fun initAnswersList(): MutableList<Answer> {
  val answers = mutableListOf<Answer>()
  answers.add(Answer(
      1,
      1,
      true,
      "Java"
  ))
  answers.add(Answer(
      2,
      1,
      false,
      "Kotlin"
  ))
  answers.add(Answer(
      3,
      1,
      false,
      "Ruby"
  ))
  answers.add(Answer(
      4,
      2,
      true,
      "42"
  ))
  answers.add(Answer(
      5,
      2,
      false,
      "35"
  ))
  answers.add(Answer(
      6,
      2,
      false,
      "7"
  ))
  return answers
}
var questionList = initQuestionList()
var answerList = initAnswersList()
object QuestionInfoProvider {
  
  var questionList = initQuestionList()
  var answerList = initAnswersList()

  private fun initQuestionList(): MutableList<Question> {
    val questions = mutableListOf<Question>()
    questions.add(
      Question(
        1,
        "Which of the following languages is not commonly used to develop Android Apps"))
    questions.add(
      Question(
        2,
        "What is the meaning of life?"))
    return questions
  }

  private fun initAnswersList(): MutableList<Answer> {
    val answers = mutableListOf<Answer>()
    answers.add(Answer(
        1,
        1,
        true,
        "Java"
    ))
    answers.add(Answer(
        2,
        1,
        false,
        "Kotlin"
    ))
    answers.add(Answer(
        3,
        1,
        false,
        "Ruby"
    ))
    answers.add(Answer(
        4,
        2,
        true,
        "42"
    ))
    answers.add(Answer(
        5,
        2,
        false,
        "35"
    ))
    answers.add(Answer(
        6,
        2,
        false,
        "7"
    ))
    return answers
  }
}

测试您的数据库

虽然App Noti Notiing但是,您可以通过对验证Wets进行一些成功来执行一些成功的数据库

@RunWith(AndroidJUnit4::class)
class QuizDaoTest { // 1
  @Rule
  @JvmField
  val rule: TestRule = InstantTaskExecutorRule() // 2

  private lateinit var database: QuizDatabase // 3
  private lateinit var quizDao: QuizDao // 4
}
@Before
fun setUp() {
  val context: Context = InstrumentationRegistry.getInstrumentation().context // 1
  try {
    database = Room.inMemoryDatabaseBuilder(context, QuizDatabase::class.java) //2
        .allowMainThreadQueries() //3
        .build()
  } catch (e: Exception) {
    Log.i(this.javaClass.simpleName, e.message) //4
  }
  quizDao = database.quizDao() //5
}
@Test
fun testInsertQuestion() {
  // 1
  val previousNumberOfQuestions = quizDao.getAllQuestions().size
  //2
  val question = Question(1, "What is your name?")
  quizDao.insert(question)
  //3
  val numberOfQuestions = quizDao.getAllQuestions().size
  // 4
  val numberOfNewQuestions = 
      numberOfQuestions - previousNumberOfQuestions
  // 5
  Assert.assertEquals(1, numberOfNewQuestions)
  // 6
  quizDao.clearQuestions()
  // 7
  Assert.assertEquals(0, quizDao.getAllQuestions().size)
}
@Test
fun testClearQuestions() {
  for (question in QuestionInfoProvider.questionList) {
    quizDao.insert(question)
  }
  Assert.assertTrue(quizDao.getAllQuestions().isNotEmpty())
  Log.d("testData", quizDao.getAllQuestions().toString())
  quizDao.clearQuestions()
  Assert.assertTrue(quizDao.getAllQuestions().isEmpty())
}
@After
fun tearDown() {
  database.close()
}

关键点

哇,来自?

您现在知道如何创建DAO与数据库进行交互。您可以通过在本章中打开附件下载最终项目,如果您想了解更多有关房间的DAOS,您可以探索以下资源:

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里 .

有反馈分享在线阅读体验吗? 如果您与UUR在线阅读器的UI,UX,Heativisting或其他功能有反馈,您可以使用下文:

© 2021 Razeware LLC

您可以免费读取,本章的部分显示为 混淆了 文本。解锁这一点,我们的整个书籍和视频目录,RaznderLine.com专业提交。

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。