Android学习--持久化(三) SQLite & LitePal

 

SQLite & LitePaljava


 

    本身作为一个iOS开发,看到安卓这一块的时候,那中浓烈的熟悉味道更增强烈,SQLite这种轻量级的关系型数据库的使用在移动端相差很少,iOS有FMDB,Android有LitePal, 这一篇文章好好总结一下 SQLite & LitePal,因为本身用的是Mac系统,在配置 adb的时候也遇到了一些问题,把这些问题也都说一下,避免你们跳太多的坑吧。这个咱们就先说说在Mac系统下配置这个adb,由于这个不论是咱们使用原生SQLite仍是用LitePal,这东西都是必须的,说以先说说它的一个配置:android

 

adbgit


 

      adb是 Android SDK自带的一个调试工具,使用这个工具能够直接对链接在电脑上的手机或者模拟器进行调试操做,使用adb shell 能够对数据库和表的建立状况进行检查。它存放在SDK的platform-tools目录下,若是想要在命令行中使用这个工具,就须要先把它的路径配置到环境变量中。github

      Windows系统的咱们就不说了,这个本身上网找,相信会有不少不少的教程,就说说在Mac系统下adb的安装教程:sql

      先在你的SDK Manager 里面找一下你的SDK的位置,以下图两点中须要注意的地方,一个是SDK位置,一个是下载Platform - Tools:shell

 

 

       而后打开你的终端咱们继续:数据库

       一、检查一下你是否是有.bash_profile文件,打开终端 ls  -a 查看一下是否是有这个文件,没有的就到下一步,有的就跳过第二步数组

      二、没有上面查看的文件,输入 touch .bash_profile 建立文件bash

      三、打开.bash_profile文件,对其内容进行编辑,命令以下:open -e .bash_profileapp

      四、此时文本编辑器会打开一个文本,编辑内容以下:注意!!!下面ABC就是你在前面看到的SDK的路径! 

           export PATH=${PATH}:ABC/platform-tools

           export PATH=${PATH}:ABC/tools

      五、更新刚配置的环境变量,输入: source .bash_profile

      六、检查一下是否配置成功 输入: adb

      七、只要不出现command not found,那就说明配置没问题了!

 

SQLite


     

      一:SQLite的建立      

      Android为了让咱们更加方便的管理数据库,专门提供了一个SQLiteOpenHelper的抽象类,这意味的咱们要是想使用它的话就得咱们建立一个类去继承它,SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),咱们也必须在本身的类当中去重写这两个方法,分别在这两个方法中去实现建立和升级数据库的逻辑。

      SQLiteOpenHelper当中有两个很是重要的实例化方法,getReadableDatabase()和getWritableDatabase(),这两个方法均可以建立或者而打开一个现有的数据库,入伙数据库已经存在就直接打开,不然会建立一个新的数据库,并返回一个能够对数据库进行操做的对象,不一样的是,当数据库不可写入的时候(好比磁盘已满)。getReadableDatabase()方法返回的对象将以只读的方法打开数据库,而getWritableDatabase()方法则将出现异常。

      SQLiteOpenHelper中有两个构造方法可供重写,通常使用参数比较少的那个构造方法便可,这个构造方法中接收四个参数,第一个参数是Context,这个没什么好说的,第二个参数是数据库名称,第三个参数容许咱们再查询数据的时候返回一个自定义的cursor,通常传入都是null,第四个参数是当前数据库的版本号,这个额能够对数据库进行升级操做,构建出SQLiteOpenHelper实例以后再调用前面咱们说的getReadableDatabase()或getWritableDatabase()就可以建立数据库了,数据库文件会存放在/data/data/<package name >/database 目录下。此时重写的 onCreat()方法也会获得执行。因此一般会在这里作一些建立表的逻辑。

     (具体代码下面)

 

      二:SQLite的升级

      咱们想象这样一个场景,咱们要是须要在数据库当中添加一张表那咱们须要怎么办呢?简单啊,咱们在建立的表的方法onCreate()里面添加一条建立表的语句就能够了啊,仔细想象这样真的能够吗?实际上是不行的,由于你已经存在的数据库是没办法在走onCreate方法的, 那怎么办?把之前的程序删除了,从新安装,额。。这样作不行的,这里就要使用咱们的数据库的升级了。

      咱们利用的就是onUpgrade()方法+前面初始化时候的版本号,接着利用上面代码,咱们升级一下咱们这个数据库,给里面再添加一张表。

    (具体代码下面)

 

      三:SQLite的增删查改

      下面代码是上面三点的代码的总结,代码是写在一块儿的,下面是咱们写的SQManager文件内容:

package SQManager;

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

/**
 * Created by skotc on 2018/7/17.
 */
public class SQManager extends SQLiteOpenHelper {

    public static  final String CREATE_BOOK = " create table Book (" +
            "id integer primary key autoincrement" +
            "author text" +
            "price real" +
            "pages integer" +
            "name text)";
    public static  final String CREATE_CATEGORY = " create table Category (" +
            "id integer primary key autoincrement" +
            "category_name text" +
            "category_code integer)";

    private Context mContext;
    public SQManager(Context context,String name, SQLiteDatabase.CursorFactory factory, int version){

        super(context,name,factory,version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        sqLiteDatabase.execSQL(CREATE_BOOK);
        Toast.makeText(mContext, "Create Succeed", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        // 这两条drop语句,若是发现数据库中已经存在表,那就将这两张表删除掉,造调用onCreate从新建立
        // 这里咱们有一点须要注意的是若是表已经存在,再去建立就会报错
        sqLiteDatabase.execSQL("drop table if exists Book");
        sqLiteDatabase.execSQL("drop table if exists Category");
        onCreate(sqLiteDatabase);

    }
}

 

      再把MainActivity文件的内容展现出来: 

package com.example.skotc.sqlitetest;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabaseLockedException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import SQManager.SQManager;

public class MainActivity extends AppCompatActivity {

    private SQManager sqManager;
    private SQLiteDatabase sqLiteDatabase;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //
        sqManager = new SQManager(this,"BookStore",null,1);

        //sqManager = new SQManager(this,"BookStore",null,1);

        Button SQButton = (Button)findViewById(R.id.SQButton);
        SQButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // 第一次调用的时候检测到没有BookStore这个数据库就回去建立这个数据库
                sqLiteDatabase = sqManager.getWritableDatabase();

                ContentValues values = new ContentValues();
                values.put("name","我是中国人");
                values.put("author","zhangxu");
                values.put("pages",500);
                values.put("price",15.4);

                //insert 第一个参数是表的名称  第二个参数是用于在未指定添加的状况下给某些可为空的列自动复制为NULL
                //第三个参数是咱们的ContentValues对象
                sqLiteDatabase.insert("Book",null,values);

                //组装第二条数据
                values.put("name","我在广州");
                values.put("author","james");
                values.put("pages",343);
                values.put("price",19.4);
                sqLiteDatabase.insert("Book",null,values);

                //这里有个问题须要咱们注意一下
                //为何咱们没有在ID的哪一列没有赋值呢?这还少由于在前面建立表的时候,咱们将ID设置为了自增
                //它的值会在入库的时候自动的增长

                //先说这句更新的意思
                //总体语句的意思是把书名叫我在广州的书的价格修改成10.0
                values.put("price","10.0");
                //说说update方法的参数
                //第一和表名,第二个是修改的values,第三,第四是用于约束更新某一行或者几行的数据
                //更新全部name = ?的行,而?是一个占位符,在第四个参数提供了一个字符串数组为第三个参数中的每个占位符
                //提供相应的内容
                sqLiteDatabase.update("Book", values, "name = ?", new String[]{"我在广州"});


                //delete删除
                //第一和表名,第二个参数是删除的条件,第三个参数是给约束条件赋值,没和前面的更新道理相同
                sqLiteDatabase.delete("Book","page > ?",new String[]{"300"});


                // 查询
                // 这里须要注意的就是query方法的参数解析
                // 第一个参数是表名称
                // 第二个参数用于指定查询那一列,要是没有至此那个就查询全部
                // 第三,第四各参数用于约束查询某一行或者几行的数据,这个和前面的同样道理
                // 第五个参数用于指定须要去group by的列,不指定则表示不须要对查询结果进行 group by操做
                // 第六个参数用于对第五步 group by 以后的数据进行进一步的过滤,不指定就不进行过滤
                // 第七个参数用于指定查询结果的排序方式,不指定就是默认排序

                Cursor cursor = sqLiteDatabase.query("Book",null,null,null,null,null,null);
                if (cursor.moveToFirst()){

                    do {

                        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","name = "+name);
                        Log.d("MainActivity","author = "+author);
                        Log.d("MainActivity","pages = "+pages);
                        Log.d("MainActivity","price = "+price);

                    }while (cursor.moveToNext());
                }
                cursor.close();
            }
        });
    }
}

 

LitePal


 

        LitePal是郭神(郭霖)在2014年的杰做,三年后在github上有了一个更新,故来学习一番,没想到还挺好用,这里作下笔记。LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将咱们平时开发时最经常使用到的一些数据库功能进行了封装,使得不用编写一行SQL语句就能够完成各类建表、増删改查的操做。而且LitePal很“轻”,jar包只有100k不到,并且近乎零配置,这一点和hibernate这类的框架有很大区别。

      基本的配置:
 
      一、引入我么的LitePal包
          因为咱们的LitePal也是提交到jcenter的,因此咱们能够经过在app/build.gradle 文件中声明该开源库的引用就能够了,代码以下:(LitePal的版本已经来到2.0)

      二、配置一下咱们的litepal.xml文件,在app/src/main路径下经过 New - Directory 建立一个assect 目录,  而后再assect目录下新建一个 litepal.xml文件。接着编辑里面的内容,内容以下:

 

      三、最后就是修改一下咱们的 AndroidMainfest.xml文件了,将咱们的项目的application配置为 org.litepal,litePalApplication,这样才能让LitePal全部功能正常的使用,以后咱们会在补充关于 application的内容的时候会讲解一下为何!

 

      它的使用:
      关于它的映射类这部分的类容咱们和关于它CRUD的操做依据里面的注意事项就直接上代码,把他们放在代码中说:
      映射类的建立就不说了,你本身建立一个java类,添加变量重写get以及set方法就好了,关键的点是在进行关于它CRUD的操做的时候,在之前是须要咱们把咱们的映射类继承DataSupport的,但如今这个类已经被废弃了,而是选择使用 LitePalSupport,这点在代码中有具体的提现:
 
      看看咱们定义的映射类,注意写的注释:

 

      最后就是咱们关于它的CRUD的操做:
 
 
相关文章
相关标签/搜索