8002117067 徐梓涵 软件工程1702


什么是数据存储持久化技术?

  • 首先我们先了解一下什么是瞬时数据,瞬时数据是指在内存当中,可能由于程序关闭或者其他原因而导致的被内存回收的数据。
  • 而数据存储持久化技术就是为了将内存中的数据保存到存储设备之中,保证手机在关机的情况下数据仍然不会丢失。
  • 安卓中采用了三种的简单的方式来进行数据持久化的功能:
    1. 文件存储技术
    2. SharedPreference存储技术
    3. 数据库存储技术


由于前面两种比较简单,所以这里主要使用第三种方式,本篇读书笔记我将通过三种方式(1.简单使用SQLite; 2.LitePal框架;3.greenDAO)来演示操作数据库.


1.简单使用SQLite来完成数据库的增删改查:

Android提供了一个SQLiteOpenHelper来帮助创建数据库以及升级数据库,我们创建一个类来继承它,并且实现方法。这里如果多次点击创建数据库就会删除之前的数据库然后重新创建。

(1)使用SQLiteOpenHelper创建数据库,以及更新数据库

  • MyDatabaseHelper.java ```java package com.ncu.databasetest;

import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast;

import androidx.annotation.Nullable;

public class MyDatabaseHelper extends SQLiteOpenHelper {

  1. //创建表格Sql语句
  2. public static final String CREATE_BOOK = "create table Book ("
  3. + "id integer primary key autoincrement, "
  4. + "author text, "
  5. + "price real, "
  6. + "pages integer, "
  7. + "name text)";
  8. public static final String CREATE_CATEGORY = "create table Category ("
  9. + "id integer primary key autoincrement, "
  10. + "category_name text, "
  11. + "category_code integer)";
  12. private Context mContext;
  13. public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
  14. super(context, name, factory, version);
  15. mContext = context;
  16. }
  17. @Override
  18. public void onCreate(SQLiteDatabase db) {
  19. //添加图书基本
  20. db.execSQL(CREATE_BOOK);
  21. //添加查询详细信息
  22. db.execSQL(CREATE_CATEGORY);
  23. Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
  24. }
  25. @Override
  26. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  27. //为了每次都可以创建成功如果存在就删除掉
  28. db.execSQL("drop table if exists Book");
  29. db.execSQL("drop table if exists Category");
  30. onCreate(db);
  31. }

}

  1. <a name="Cm2nt"></a>
  2. ### (2)修改XML文件方便后面实现功能
  3. - activity_main.xml
  4. ```xml
  5. <?xml version="1.0" encoding="utf-8"?>
  6. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  7. xmlns:app="http://schemas.android.com/apk/res-auto"
  8. xmlns:tools="http://schemas.android.com/tools"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11. tools:context=".MainActivity">
  12. <Button
  13. android:id="@+id/button5"
  14. android:layout_width="364dp"
  15. android:layout_height="79dp"
  16. android:text="SERCH DATA"
  17. app:layout_constraintBottom_toBottomOf="parent"
  18. app:layout_constraintEnd_toEndOf="parent"
  19. app:layout_constraintHorizontal_bias="0.489"
  20. app:layout_constraintStart_toStartOf="parent"
  21. app:layout_constraintTop_toTopOf="parent"
  22. app:layout_constraintVertical_bias="0.717" />
  23. <Button
  24. android:id="@+id/button2"
  25. android:layout_width="364dp"
  26. android:layout_height="79dp"
  27. android:text="ADD DATA"
  28. app:layout_constraintBottom_toBottomOf="parent"
  29. app:layout_constraintEnd_toEndOf="parent"
  30. app:layout_constraintHorizontal_bias="0.489"
  31. app:layout_constraintStart_toStartOf="parent"
  32. app:layout_constraintTop_toTopOf="parent"
  33. app:layout_constraintVertical_bias="0.225" />
  34. <Button
  35. android:id="@+id/button3"
  36. android:layout_width="364dp"
  37. android:layout_height="79dp"
  38. android:text="DELETE DATA"
  39. app:layout_constraintBottom_toBottomOf="parent"
  40. app:layout_constraintEnd_toEndOf="parent"
  41. app:layout_constraintHorizontal_bias="0.489"
  42. app:layout_constraintStart_toStartOf="parent"
  43. app:layout_constraintTop_toTopOf="parent"
  44. app:layout_constraintVertical_bias="0.392" />
  45. <Button
  46. android:id="@+id/button4"
  47. android:layout_width="364dp"
  48. android:layout_height="79dp"
  49. android:text="UPDATA DATA"
  50. app:layout_constraintBottom_toBottomOf="parent"
  51. app:layout_constraintEnd_toEndOf="parent"
  52. app:layout_constraintHorizontal_bias="0.489"
  53. app:layout_constraintStart_toStartOf="parent"
  54. app:layout_constraintTop_toTopOf="parent"
  55. app:layout_constraintVertical_bias="0.553" />
  56. <Button
  57. android:id="@+id/button"
  58. android:layout_width="364dp"
  59. android:layout_height="79dp"
  60. android:text="Create database"
  61. app:layout_constraintBottom_toBottomOf="parent"
  62. app:layout_constraintEnd_toEndOf="parent"
  63. app:layout_constraintHorizontal_bias="0.498"
  64. app:layout_constraintStart_toStartOf="parent"
  65. app:layout_constraintTop_toTopOf="parent"
  66. app:layout_constraintVertical_bias="0.046" />
  67. </androidx.constraintlayout.widget.ConstraintLayout>

显示出来的效果:
image.png

(3)接下来对对应的按键实现具体的功能

  • 实现创建数据库按钮功能

    1. Button createDatabase = (Button)findViewById(R.id.button);
    2. createDatabase.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. dbHelper.getWritableDatabase();
    6. }
    7. });
  • 实现添加数据功能

    1. //添加数据
    2. Button addData = (Button) findViewById(R.id.button2);
    3. addData.setOnClickListener(new View.OnClickListener() {
    4. @Override
    5. public void onClick(View v) {
    6. SQLiteDatabase db = dbHelper.getWritableDatabase();
    7. //数据载体
    8. ContentValues values = new ContentValues();
    9. // 开始组装第一条数据
    10. values.put("name", "The Da Vinci Code");
    11. values.put("author", "Dan Brown");
    12. values.put("pages", 454);
    13. values.put("price", 16.96);
    14. db.insert("Book", null, values); // 插入第一条数据
    15. values.clear();
    16. // 开始组装第二条数据
    17. values.put("name", "The Lost Symbol");
    18. values.put("author", "Dan Brown");
    19. values.put("pages", 510);
    20. values.put("price", 19.95);
    21. db.insert("Book", null, values); // 插入第二条数据
    22. }
    23. });
  • 实现更新数据的功能

    1. Button updateData = (Button) findViewById(R.id.button3);
    2. updateData.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. SQLiteDatabase db = dbHelper.getWritableDatabase();
    6. ContentValues values = new ContentValues();
    7. values.put("price", 10.99);
    8. db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
    9. }
    10. });
  • 实现删除数据的功能

    1. Button deleteButton = (Button) findViewById(R.id.button4);
    2. deleteButton.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. SQLiteDatabase db = dbHelper.getWritableDatabase();
    6. db.delete("Book", "pages > ?", new String[] { "500" });
    7. }
    8. });
  • 实现查询数据的功能

    1. Button queryButton = (Button) findViewById(R.id.button5);
    2. queryButton.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. SQLiteDatabase db = dbHelper.getWritableDatabase();
    6. // 查询Book表中所有的数据,游标
    7. Cursor cursor = db.query("Book", null, null, null, null, null, null);
    8. if (cursor.moveToFirst()) {
    9. do {
    10. // 遍历Cursor对象,取出数据并打印
    11. String name = cursor.getString(cursor.getColumnIndex("name"));
    12. String author = cursor.getString(cursor.getColumnIndex("author"));
    13. int pages = cursor.getInt(cursor.getColumnIndex("pages"));
    14. double price = cursor.getDouble(cursor.getColumnIndex("price"));
    15. Log.d("MainActivity", "book name is " + name);
    16. Log.d("MainActivity", "book author is " + author);
    17. Log.d("MainActivity", "book pages is " + pages);
    18. Log.d("MainActivity", "book price is " + price);
    19. } while (cursor.moveToNext());
    20. }
    21. cursor.close();
    22. }
    23. });
  • 整体的MainActivity.java ```java package com.ncu.databasetest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button;

import pl.com.salsoft.sqlitestudioremote.SQLiteStudioService;

public class MainActivity extends AppCompatActivity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SQLiteStudioService.instance().start(this); //现在的版本升级了 dbHelper = new MyDatabaseHelper(this,”BookStore.db”,null,2); Button createDatabase = (Button)findViewById(R.id.button); createDatabase.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); //添加数据 Button addData = (Button) findViewById(R.id.button2); addData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); //数据载体 ContentValues values = new ContentValues(); // 开始组装第一条数据 values.put(“name”, “The Da Vinci Code”); values.put(“author”, “Dan Brown”); values.put(“pages”, 454); values.put(“price”, 16.96); db.insert(“Book”, null, values); // 插入第一条数据 values.clear(); // 开始组装第二条数据 values.put(“name”, “The Lost Symbol”); values.put(“author”, “Dan Brown”); values.put(“pages”, 510); values.put(“price”, 19.95); db.insert(“Book”, null, values); // 插入第二条数据 } }); Button updateData = (Button) findViewById(R.id.button3); updateData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(“price”, 10.99); db.update(“Book”, values, “name = ?”, new String[] { “The Da Vinci Code” }); } }); Button deleteButton = (Button) findViewById(R.id.button4); deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete(“Book”, “pages > ?”, new String[] { “500” }); } }); Button queryButton = (Button) findViewById(R.id.button5); queryButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); // 查询Book表中所有的数据,游标 Cursor cursor = db.query(“Book”, null, null, null, null, null, null); if (cursor.moveToFirst()) { do { // 遍历Cursor对象,取出数据并打印 String name = cursor.getString(cursor.getColumnIndex(“name”)); String author = cursor.getString(cursor.getColumnIndex(“author”)); int pages = cursor.getInt(cursor.getColumnIndex(“pages”)); double price = cursor.getDouble(cursor.getColumnIndex(“price”)); Log.d(“MainActivity”, “book name is “ + name); Log.d(“MainActivity”, “book author is “ + author); Log.d(“MainActivity”, “book pages is “ + pages); Log.d(“MainActivity”, “book price is “ + price); } while (cursor.moveToNext()); } cursor.close(); } }); } }

  1. - 实验效果演示:
  2. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588068923701-aa3eee68-2a24-4fa7-92b1-b67e9fbb488c.png#align=left&display=inline&height=897&margin=%5Bobject%20Object%5D&name=image.png&originHeight=897&originWidth=1440&size=67498&status=done&style=none&width=1440)
  3. - 这里说一下我使用的可视化数据库的工具是SQLiteStudio,这个工具我觉得非常的好用,只需要使用它提供的一个jar包(SQLiteStudioRemote.jar)导入到项目种,然后当项目正常运行的时候就可以通过这个工具连接上数据库,我后面也都会使用这个工具来查看数据库。
  4. - 接下来演示添加删除更新以及查询功能。
  5. 1)创建出来的数据库,以及表的结构:<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588077877699-35f8e86b-aba7-409c-84d3-55a4a8913710.png#align=left&display=inline&height=826&margin=%5Bobject%20Object%5D&name=image.png&originHeight=826&originWidth=1359&size=90533&status=done&style=none&width=1359)<br />(2)添加功能,根据代码我写的内容将会添加上两条数据。<br />由于我之前插入过了数据,而数据的id我设置的是自动增加,所以现在是23,24。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588078656390-be3f5785-e619-4f8b-9725-fc0ff463ea47.png#align=left&display=inline&height=283&margin=%5Bobject%20Object%5D&name=image.png&originHeight=283&originWidth=850&size=20984&status=done&style=none&width=850)<br />(3)新功能,点击更新数据来更新数据,根据我的代码功能会把书的名字为**The Da Vinci Code更新价格为10.99.**<br />**![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588078685770-3db4f8cf-501b-4bb8-9084-b7f0a932f648.png#align=left&display=inline&height=319&margin=%5Bobject%20Object%5D&name=image.png&originHeight=319&originWidth=733&size=22037&status=done&style=none&width=733)**<br />(4)删除功能,根据我写的代码,当页数大于500的时候就会删除掉这一项:<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588079197908-46326d02-863b-4dcd-9100-5b275b1ab873.png#align=left&display=inline&height=334&margin=%5Bobject%20Object%5D&name=image.png&originHeight=334&originWidth=965&size=33403&status=done&style=none&width=965)<br />(5)最后是查询功能,现在还有一条数据,根据我写的代码会查询数据库种所有的数据,然后显示到我的Logcat中来:<br />如图:<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588079394435-7f18c25e-8fff-4a61-8d81-7c9288dee744.png#align=left&display=inline&height=92&margin=%5Bobject%20Object%5D&name=image.png&originHeight=131&originWidth=1067&size=17250&status=done&style=none&width=746)
  6. ---
  7. <a name="q2mNi"></a>
  8. ## 2.使用LitePal来对SQLite数据库进行操作
  9. ---
  10. > LitePal介绍:
  11. > LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表、増删改查的操作。并且LitePal很“轻”,jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别。
  12. ---
  13. LitePal的使用比上一种的方法简单一些,下面就会对LitePal的介绍:
  14. <a name="RlpMg"></a>
  15. ### (1)配置使用LitePal
  16. - 修改build.gradle(Module:app)
  17. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588083429920-6ae6b8c8-c54c-42c3-b942-115eb91d847a.png#align=left&display=inline&height=256&margin=%5Bobject%20Object%5D&name=image.png&originHeight=256&originWidth=709&size=23026&status=done&style=none&width=709)
  18. - 创建一个资源包assets,创建一个litepal.xml:
  19. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588083631548-c555b4f8-b70e-4412-8aca-eb23441ec035.png#align=left&display=inline&height=488&margin=%5Bobject%20Object%5D&name=image.png&originHeight=488&originWidth=387&size=28502&status=done&style=none&width=387)<br />litepal.xml:
  20. ```xml
  21. <?xml version="1.0" encoding="utf-8"?>
  22. <litepal>
  23. <dbname value="LitePal" ></dbname>
  24. <version value="1" ></version>
  25. <list>
  26. <mapping class="com.ncu.litepaltest.Book"></mapping>
  27. <mapping class="com.ncu.litepaltest.Category"></mapping>
  28. </list>
  29. </litepal>

在这个litepal.xml文件中我们首先绑定了数据库LitePal,然后绑定了两个表。

  • 在AndroidMainifast.xml中加上一句话:

image.png
这样就已经配置好了。

(2)配置表

由于litepal是ORM对象映射模式,所以还需要有两个类来进行映射:

  • Book.java: ```xml package com.ncu.litepaltest;

import org.litepal.crud.DataSupport;

public class Book extends DataSupport {

  1. private int id;
  2. private String author;
  3. private double price;
  4. private int pages;
  5. private String name;
  6. private String press;
  7. public int getId() {
  8. return id;
  9. }
  10. public void setId(int id) {
  11. this.id = id;
  12. }
  13. public String getAuthor() {
  14. return author;
  15. }
  16. public void setAuthor(String author) {
  17. this.author = author;
  18. }
  19. public double getPrice() {
  20. return price;
  21. }
  22. public void setPrice(double price) {
  23. this.price = price;
  24. }
  25. public int getPages() {
  26. return pages;
  27. }
  28. public void setPages(int pages) {
  29. this.pages = pages;
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public String getPress() {
  38. return press;
  39. }
  40. public void setPress(String press) {
  41. this.press = press;
  42. }

}

  1. - Category.java:
  2. ```java
  3. package com.ncu.litepaltest;
  4. import org.litepal.crud.DataSupport;
  5. public class Category extends DataSupport {
  6. private int id;
  7. private String categoryName;
  8. private int categoryCode;
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public void setCategoryName(String categoryName) {
  13. this.categoryName = categoryName;
  14. }
  15. public void setCategoryCode(int categoryCode) {
  16. this.categoryCode = categoryCode;
  17. }
  18. }

(3)完成增删改查功能

上面就已经配置完了,接下来就实现功能:

  • 连接创建数据库,由于上面都配置完了,所以我们只需要简单的数据库操作就可以实现创建数据库了:

    1. Button createDatabase = (Button) findViewById(R.id.button);
    2. createDatabase.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. Connector.getDatabase();
    6. }
    7. });
  • 添加数据:

这里可以看到只需要save()就可以添加数据了,非常简单。

  1. Button addData = (Button) findViewById(R.id.button2);
  2. addData.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. Book book = new Book();
  6. book.setName("The Da Vinci Code");
  7. book.setAuthor("Dan Brown");
  8. book.setPages(454);
  9. book.setPrice(16.96);
  10. book.setPress("Unknow");
  11. book.save();
  12. }
  13. });
  • 更新数据:

    1. Button updateData = (Button) findViewById(R.id.button4);
    2. updateData.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. Book book = new Book();
    6. book.setPrice(14.95);
    7. book.setPress("Anchor");
    8. book.updateAll("name = ? and author = ?", "The Da Vinci Code", "Dan Brown");
    9. }
    10. });
  • 删除数据:

    1. Button deleteButton = (Button) findViewById(R.id.button3);
    2. deleteButton.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. DataSupport.deleteAll(Book.class, "price < ?", "15");
    6. }
    7. });
  • 查询数据:

    1. Button queryButton = (Button) findViewById(R.id.button5);
    2. queryButton.setOnClickListener(new View.OnClickListener() {
    3. @Override
    4. public void onClick(View v) {
    5. List<Book> books = DataSupport.findAll(Book.class);
    6. for (Book book: books) {
    7. Log.d("MainActivity", "book name is " + book.getName());
    8. Log.d("MainActivity", "book author is " + book.getAuthor());
    9. Log.d("MainActivity", "book pages is " + book.getPages());
    10. Log.d("MainActivity", "book price is " + book.getPrice());
    11. Log.d("MainActivity", "book press is " + book.getPress());
    12. }
    13. }
    14. });
  • 整个的MainActivity.java: ```java package com.ncu.litepaltest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button;

import org.litepal.crud.DataSupport; import org.litepal.tablemanager.Connector;

import java.util.List;

import pl.com.salsoft.sqlitestudioremote.SQLiteStudioService;

public class MainActivity extends AppCompatActivity {

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. SQLiteStudioService.instance().start(this);
  6. Button createDatabase = (Button) findViewById(R.id.button);
  7. createDatabase.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. Connector.getDatabase();
  11. }
  12. });
  13. Button addData = (Button) findViewById(R.id.button2);
  14. addData.setOnClickListener(new View.OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. Book book = new Book();
  18. book.setName("The Da Vinci Code");
  19. book.setAuthor("Dan Brown");
  20. book.setPages(454);
  21. book.setPrice(16.96);
  22. book.setPress("Unknow");
  23. book.save();
  24. }
  25. });
  26. Button updateData = (Button) findViewById(R.id.button4);
  27. updateData.setOnClickListener(new View.OnClickListener() {
  28. @Override
  29. public void onClick(View v) {
  30. Book book = new Book();
  31. book.setPrice(14.95);
  32. book.setPress("Anchor");
  33. book.updateAll("name = ? and author = ?", "The Da Vinci Code", "Dan Brown");
  34. }
  35. });
  36. Button deleteButton = (Button) findViewById(R.id.button3);
  37. deleteButton.setOnClickListener(new View.OnClickListener() {
  38. @Override
  39. public void onClick(View v) {
  40. DataSupport.deleteAll(Book.class, "price < ?", "15");
  41. }
  42. });
  43. Button queryButton = (Button) findViewById(R.id.button5);
  44. queryButton.setOnClickListener(new View.OnClickListener() {
  45. @Override
  46. public void onClick(View v) {
  47. List<Book> books = DataSupport.findAll(Book.class);
  48. for (Book book: books) {
  49. Log.d("MainActivity", "book name is " + book.getName());
  50. Log.d("MainActivity", "book author is " + book.getAuthor());
  51. Log.d("MainActivity", "book pages is " + book.getPages());
  52. Log.d("MainActivity", "book price is " + book.getPrice());
  53. Log.d("MainActivity", "book press is " + book.getPress());
  54. }
  55. }
  56. });
  57. }

}

  1. - 最后我们来看一下显示的效果:
  2. - 创建数据显示:
  3. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588089210977-ac780fea-6c2c-4000-a6d4-310782ff90ef.png#align=left&display=inline&height=826&margin=%5Bobject%20Object%5D&name=image.png&originHeight=826&originWidth=1359&size=103711&status=done&style=none&width=1359)
  4. - 添加数据:
  5. 这里添加了一条数据:<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588089245076-29799fef-108d-4326-9101-44db98ebd80c.png#align=left&display=inline&height=826&margin=%5Bobject%20Object%5D&name=image.png&originHeight=826&originWidth=1359&size=84696&status=done&style=none&width=1359)
  6. - 更新数据,这里将价格进行修改为14.95
  7. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588089374154-3a624ce4-73d5-4280-a2cb-192ff388516c.png#align=left&display=inline&height=285&margin=%5Bobject%20Object%5D&name=image.png&originHeight=285&originWidth=624&size=15120&status=done&style=none&width=624)
  8. - 查询数据:
  9. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588089418146-3b87da7e-c6c0-4ca3-a57a-1cf0ea2ad8f6.png#align=left&display=inline&height=123&margin=%5Bobject%20Object%5D&name=image.png&originHeight=149&originWidth=907&size=19458&status=done&style=none&width=746)
  10. - 删除数据:
  11. 这里数据被清空了。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588089447625-81d68268-cbcd-4bfc-ac27-833ad639aa39.png#align=left&display=inline&height=231&margin=%5Bobject%20Object%5D&name=image.png&originHeight=231&originWidth=599&size=14151&status=done&style=none&width=599)<br />到此完成使用LitePal来使用数据库SQLite。
  12. ---
  13. <a name="kPEf1"></a>
  14. ## 3.使用GreenDao数据库来对SQLite进行操作
  15. ---
  16. > GreenDao介绍:
  17. > GreenDAO是一个**对象关系映射**(ORM Object RelationShop Mapping)的框架,能够提供一个**接口通过操作对象的方式**去操作关系型数据库,它能够让你操作数据库时更简单、更方便。
  18. > <br />> GreenDao的优点:
  19. > ①性能高,号称Android最快的关系型数据库,存取速度快
  20. > ②内存占用小
  21. > ③库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
  22. > ④支持数据库加密 greendao支持SQLCipher进行数据库加密
  23. > ⑤激活实体,支持缓存,代码自动生成。
  24. ---
  25. <a name="yLHhz"></a>
  26. ### (1)配置使用GreenDao
  27. - Project-gradle 配置
  28. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588090054734-76df77d4-8536-483f-9ae9-bb0fd2e977ce.png#align=left&display=inline&height=596&margin=%5Bobject%20Object%5D&name=image.png&originHeight=596&originWidth=891&size=37842&status=done&style=none&width=891)
  29. - app-gradle 配置
  30. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/489622/1588090113848-12d0cee4-720f-40d9-89dd-5330ab9e6b7d.png#align=left&display=inline&height=512&margin=%5Bobject%20Object%5D&name=image.png&originHeight=512&originWidth=1023&size=50527&status=done&style=none&width=1023)<br />注意这里的GreenDao的数据库已经在这里配置好了,而包名和文件夹名在后面的自动创建的文件就会使用到。
  31. <a name="dt8vw"></a>
  32. ### (2)创建表关联的类
  33. - 创建一个类User.java
  34. ```java
  35. @Entity
  36. public class User {
  37. @Id(autoincrement = true)
  38. private Long id;
  39. private String name;
  40. private int age;
  41. }
  • 然后Build一下:
    image.png
  • 神奇的一幕出现了,编译器帮我配置好了三个核心类

image.png

这三个类的意义: DevOpenHelper:创建SQLite数据库的SQLiteOpenHelper的具体实现 DaoMaster:GreenDao的顶级对象,作为数据库对象、用于创建表和删除表 DaoSession:管理所有的Dao对象,Dao对象中存在着增删改查等API

(3)创建DaoManager:

这个是用来创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级的。

  1. package com.ncu.greendao;
  2. import android.content.Context;
  3. import android.view.View;
  4. import com.ncu.greendao.db.DaoMaster;
  5. import com.ncu.greendao.db.DaoSession;
  6. import org.greenrobot.greendao.query.QueryBuilder;
  7. //用于创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级。
  8. public class DaoManager {
  9. private DaoMaster.DevOpenHelper helper;
  10. private DaoSession daoSession;
  11. private DaoMaster daoMaster;
  12. private static DaoManager greenDaoManager;
  13. private String DBNAME = "GreenPal";
  14. public DaoManager(){
  15. }
  16. public void init(Context context){
  17. helper = new DaoMaster.DevOpenHelper(context,DBNAME);
  18. daoMaster = new DaoMaster(helper.getWritableDb());
  19. daoSession = daoMaster.newSession();
  20. }
  21. public static DaoManager getInstance(){
  22. if (greenDaoManager == null){
  23. greenDaoManager = new DaoManager();
  24. }
  25. return greenDaoManager;
  26. }
  27. public DaoMaster.DevOpenHelper getDevOpenHelper(){
  28. return helper;
  29. }
  30. public DaoMaster getDaoMaster() {
  31. return daoMaster;
  32. }
  33. public DaoSession getDaoSession() {
  34. return daoSession;
  35. }
  36. public void closeDB(){
  37. if (helper != null){
  38. helper.close();
  39. }
  40. }
  41. }

(4)创建UserDaoUtil:

这个是用来调用的工具类,里面写了我们增删改查的具体操作,这里有的用到了,有的没有用到:

  1. package com.ncu.greendao;
  2. import android.content.Context;
  3. import android.util.Log;
  4. import java.util.List;
  5. public class UserDaoUtil {
  6. private static final String TAG = UserDaoUtil.class.getSimpleName();
  7. private DaoManager mManager;
  8. public UserDaoUtil(Context context){
  9. mManager = DaoManager.getInstance();
  10. mManager.init(context);
  11. }
  12. //1.插入单条的人的数据
  13. public boolean insertUser(User user){
  14. boolean flag = false;
  15. flag = mManager.getDaoSession().getUserDao().insert(user) == -1 ? false : true;
  16. Log.i(TAG, "insert user :" + flag + "-->" + user.toString());
  17. return flag;
  18. }
  19. //2.插入多条人的数据,在子线程中操作 插入形式List
  20. public boolean insertMultUser(final List<User> userList) {
  21. boolean flag = false;
  22. try {
  23. mManager.getDaoSession().runInTx(new Runnable() {
  24. @Override
  25. public void run() {
  26. for (User user : userList) {
  27. mManager.getDaoSession().insertOrReplace(user);
  28. }
  29. }
  30. });
  31. flag = true;
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. return flag;
  36. }
  37. //3.修改一条数据
  38. public boolean updateUser(User user){
  39. boolean flag = false;
  40. try {
  41. mManager.getDaoSession().update(user);
  42. flag = true;
  43. }catch (Exception e){
  44. e.printStackTrace();
  45. }
  46. return flag;
  47. }
  48. //删除单条数据
  49. public boolean deleteUser(User user){
  50. boolean flag = false;
  51. try {
  52. //按照id删除
  53. mManager.getDaoSession().delete(user);
  54. flag = true;
  55. }catch (Exception e){
  56. e.printStackTrace();
  57. }
  58. return flag;
  59. }
  60. //删除所有的数据
  61. public boolean deleteAll(){
  62. boolean flag = false;
  63. try {
  64. //按照id删除
  65. mManager.getDaoSession().deleteAll(User.class);
  66. flag = true;
  67. }catch (Exception e){
  68. e.printStackTrace();
  69. }
  70. return flag;
  71. }
  72. //查询所有的数据
  73. public List<User> queryAllUser(){
  74. return mManager.getDaoSession().loadAll(User.class);
  75. }
  76. //根据主键id查询数据
  77. public User queryUserById(long key){
  78. return mManager.getDaoSession().load(User.class, key);
  79. }
  80. }

(5)在MainActivity调用:

我们用这个来进行调用具体实现:

  1. package com.ncu.greendao;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.Toast;
  10. import com.ncu.greendao.db.DaoMaster;
  11. import com.ncu.greendao.db.DaoSession;
  12. import com.ncu.greendao.db.UserDao;
  13. import pl.com.salsoft.sqlitestudioremote.SQLiteStudioService;
  14. public class MainActivity extends AppCompatActivity {
  15. public static final String TAG="RightFragment";
  16. UserDaoUtil userDaoUtil;
  17. User user=null;
  18. private DaoManager mManager;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. SQLiteStudioService.instance().start(this);
  24. userDaoUtil = new UserDaoUtil(this);
  25. Button button = (Button)findViewById(R.id.button);
  26. button.setOnClickListener(new View.OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. //创建数据库成功了
  30. }
  31. });
  32. user = new User();//实例化
  33. Button button2 = (Button)findViewById(R.id.button2);
  34. button2.setOnClickListener(new View.OnClickListener() {
  35. @Override
  36. public void onClick(View v) {
  37. //由于自动增加所以其实可以不用传入id值
  38. user.setId(null);
  39. user.setAge(18);
  40. user.setName("xiaohong");
  41. userDaoUtil.insertUser(user);
  42. }
  43. });
  44. Button button3 = (Button)findViewById(R.id.button3);
  45. button3.setOnClickListener(new View.OnClickListener() {
  46. @Override
  47. public void onClick(View v) {
  48. //删除全部的
  49. userDaoUtil.deleteAll();
  50. }
  51. });
  52. Button button4= (Button)findViewById(R.id.button4);
  53. button4.setOnClickListener(new View.OnClickListener() {
  54. @Override
  55. public void onClick(View v) {
  56. user.setId((long) 1);
  57. user.setAge(19);
  58. user.setName("xiaobai");
  59. userDaoUtil.updateUser(user);
  60. }
  61. });
  62. Button button5= (Button)findViewById(R.id.button5);
  63. button5.setOnClickListener(new View.OnClickListener() {
  64. @Override
  65. public void onClick(View v) {
  66. user = userDaoUtil.queryUserById(1);
  67. Log.d(TAG,user.getName()+user.getAge());
  68. }
  69. });
  70. }
  71. }
  • 最后我们来看一下具体实现的效果:
  • 创建的数据库:

image.png

  • 添加数据:

image.png

  • 修改数据:

image.png

  • 查询数据:

image.png

  • 删除数据:

image.png


以上就是本次的读书笔记