Android LitePal

LitePal是一款开源的android数据框架,它采用了对象关系映射(ORM)的模式,并且我们平时开发最常用的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种间表和增删改查的操作。它的项目主页上也有详细的使用文档

配置LitePal

声明开源库引用

大多数开源项目都会将版本提交到jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以了。
在dependencies闭包中添加org.litepal.android:core:1.4.1

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    testCompile 'junit:junit:4.12'
    compile 'org.litepal.android:core:1.4.1'
}

配置litepal.xml

在app/src/main目录下新建assets目录,在assets目录下新建litepal.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="1"></version>
    <list>
    </list>
</litepal>

<dbname>标签用于指定数据库名,<version>用于指定版本号,<list>中就是指定的映射模型

配置LitePalApplication

修改AndroidManifest.xml中的代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.litepaltest">

    <application
        android:name="org.litepal.LitePalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ...
    </application>
</manifest>

创建和升级数据库

LitePal采取的对象关系映射的模式,那么什么是对象关系映射(ORM)呢?简单点说,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系数据库之间建立的一种映射关系,这就是对象映射关系。(还记得服务器等很多地方都有ORM思想)
不过你可不要小看对象关系映射模式,它赋予了我们一个强大的功能,就是可以用面向对象的思想来操作数据库。新建Book类:

public class Book{
    private int id;
    private String author;
    private double price;
    private int pages;
    private String name;

    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public int getId() {
        return id;
    }   
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPages() {
        return pages;
    }
    public void setPages(int pages) {
        this.pages = pages;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
}

修改litepal.xml中的代码

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="1"></version>
    <list>
        <mapping class="com.example.a51104.litepaltest.Book"></mapping>
    </list>
</litepal>

修改MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase=(Button)findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LitePal.getDatabase();//相当于调用onCreate()或者onUpgrade()
            }
        });
    }
}

当我们想要修改数据库内容时,直接修改类的内容(如增加或者删除列)、新建类(增加表)等。然后修改版本号后重新建库。当然LitePal还自动帮我们做完项非常重要的工作,就是保留之前表中的所有数据,这样就再也不用担心数据丢失的问题。

使用LitePal添加数据

  • 创建出模型类的实例,将需要存储的信息设置好后调用save()方法
  • 进行CRUD操作时需要继承DataSupport类
public class Book extends DataSupport{
   ...
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        Button addData=(Button)findViewById(R.id.insert_database);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setName("Android Studying");
                book.setAuthor("G");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknow");
                book.save();
            }
        });
    }
}

使用LitePal更新数据

已存储对象:model.isSaved()被用来判断是否已存储。在两种情况下会返回true:一种是已经调用了model.save()方法去添加数据了,此时model会被认为是已存储的对象。另一种情况是model对象是通过LitePaal提供的查询API查到的对象。
修改已经存储的对象,方法一

updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setName("Android Studying2");
                book.setAuthor("G2");
                book.setPages(510);
                book.setPrice(19.95);
                book.setPress("Unknow");
                book.save();
                book.setPrice(10.99);
                book.save();
      //更新成默认值的操作,默认值是不能直接set的可以通过这个方法指定列名进行操作
//                Book book=new Book();
//                book.setToDefault("pages");
//                book.updateAll();
            }
        });
}

方法二

updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setPrice(14.95);
                book.setPress("Author");
                book.updateAll("name=? and author=?","Android Studying","G");
            }
        });
}

使用LitePal删除数据

deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataSupport.deleteAll(Book.class,"price<?","15");
            }
        });

使用LitePal查询数据

查询所有行
List<Book> books=DtaSupport.findAll(Book.class);

queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Book>books=DataSupport.findAll(Book.class);
                for(Book book:books){
                    Log.d("MainActivity","book name is "+book.getName());
                    Log.d("MainActivity","book author is "+book.getAuthor());
                    Log.d("MainActivity","book pages is "+book.getPages());
                    Log.d("MainActivity","book price is "+book.getPrice());
                    Log.d("MainActivity","book press is "+book.getPress());
                }
            }
        });
功能 代码
查询表所有行 List<Book> books=DataSupport.findAll(Book.class);
查询第一条数据 Book firstBook=DataSupport.findFirst(Book.class);
查询最后一条数据 Book lastBook=DataSupport.findLast(Book.class);
查询指定几列数据 List<Book>books=DataSupport.select("name","author").find(Book.class)
查询指定的约束条件 List<Book>books=DataSupport.where("pages>?","400").find(Book.class)
指定结果的排序顺序 List<Book> books=DataSupport.order("price desc").find(Book.class)
查询指定结果的数量 List<Book> books=DataSupport.limit(3).find(Book.class)
指定查询结果的偏移量 List<Book> books=DataSupport.limit(3).offset(1).find(Book.class)

当然这些可以组合起来(流模式),形成强大的查询功能

SQL语言

Cursor cursor=DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20");

原文地址:https://www.cnblogs.com/code-fun/p/12922865.html