数据存储之SQLite与LitePal<一>

来源:互联网 发布:免费横道图绘制软件 编辑:程序博客网 时间:2024/05/21 15:15

SQLite

一.简意:

(1)SQLite:是一款轻量级关系数据库,占用资源少,运行速度快

(2)适用于大量复杂关系数据(file,sp此时不太适合)

二,用法:

(1)创建一个类 继承SQLiteOpenHelper,重写onCreate()和onUpgrade()方法

onCreate()方法:创建表

onUpgrade():版本更新

如下:

public class MyDatabaseHelper extends SQLiteOpenHelper {    private Context mContext;    //创表语句    public static final String CREATE_BOOK = "create table Book ("            + "id integer primary key autoincrement, "            + "author text, "            + "price real, "            + "pages integer, "            +"name text)";    //创表语句2    public static final String CREATE_CATEGORY = "create table Category ("            + "id integer primary key autoincrement, "            + "category_name text, "            + "category_code integer)";    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        mContext = context;    }    /**     * 创建表     * @param db     */    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);        db.execSQL(CREATE_CATEGORY);        Toast.makeText(mContext , "Create successed" , Toast.LENGTH_SHORT).show();    }    /**     * 更新数据表     * @param db     * @param oldVersion     * @param newVersion     */    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("drop table if exists Book");        db.execSQL("drop table if exists Category");        onCreate(db);    }}


2.在Activity中去测试:增删改查等操作

布局,定义简单的几个按钮:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <Button        android:id="@+id/create_database"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Create database"/>    <Button        android:id="@+id/add"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="add data"/>    <Button        android:id="@+id/delete"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="delete data"/>    <Button        android:id="@+id/update"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="update data"/>    <Button        android:id="@+id/retrieve"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="retrieve data"/></LinearLayout>

在Activity中去执行操作,

四个方法的运用说明在例子中

public class DataBaseActivity extends AppCompatActivity {    //创建数据库    @ViewInject(R.id.create_database)    private Button mBtnCreate;    //增加数据    @ViewInject(R.id.add)    private Button mBtnAdd;    //更新数据    @ViewInject(R.id.update)    private Button mBtnUpdate;    //删除数据    @ViewInject(R.id.delete)    private Button mBtnDelete;    //查询数据    @ViewInject(R.id.retrieve)    private Button mBtnRetrieve;    //MyDatabaseHelper对象    private MyDatabaseHelper dbHelper;    //SQLiteDatabase对象    private SQLiteDatabase db;    private static final String TAG = "DataBaseActivity";    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_database);        ViewUtils.inject(this);        //初始化:4个参数:上下文,数据库名字,CursorFactory对象,版本号;        //当需要更新数据库版本时可以+1        dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null ,1);        db = dbHelper.getWritableDatabase();    }    /**     * 创建数据库表     * @param view     */    @OnClick(R.id.create_database)    public void CreateDatabase(View view){        //创建或打开一个现有的数据库        //getReadableDatabase():当磁盘空间满时,将以只读方式去打开        //getWritableDatabase():当磁盘已满时,抛出异常        dbHelper.getWritableDatabase();    }    /**     * 增加数据:public long insert(String table, String nullColumnHack, ContentValues values)     * table:表名     * nullColunmHack:用于在未指定添加数据时,给某些空列自动赋值null     * values:ContentValues对象,添加相应数据     * @param view     */    @OnClick(R.id.add)    public void addDate(View view){        ContentValues values = new ContentValues();        //        values.put("name" , "第一行代码");        values.put("author" , "郭霖");        values.put("pages" , 570);        values.put("price" , 79.00);        db.insert("Book" , null , values);        values.clear();        //        values.put("name" , "编译原理");        values.put("author" ,"MouMou");        values.put("pages" , 500);        values.put("price" , 66.00);        db.insert("Book" , null , values);    }    /**     * 更新数据:4个参数     * 假如突然打折,更新某个商品价格     * public int update(String table, ContentValues values, String whereClause, String[] whereArgs)     * whereClause:约束某些行     * whereArgs:约束某些行的更新数据     * @param view     */    @OnClick(R.id.update)    public void updateData(View view){        ContentValues values = new ContentValues();        values.put("price" , 58.99);        db.update("Book" , values , "name = ?",new String[]{"编译原理"});    }    /**     * 删除数据:4个参数     * public int delete(String table, String whereClause, String[] whereArgs)     * 与update类似     * @param view     */    @OnClick(R.id.delete)    public void deleteData(View view){        db.delete("Book" , "price < ?" ,new  String[]{"60"});    }    /**     * 查询数据:7个参数     *     public Cursor query(String table, String[] columns, String selection,     * String[] selectionArgs, String groupBy, String having,     * String orderBy)     * table--查询的表名,columns--指定要查询的列名(select column1,column2...)     * selection ---- 指定where的约束条件(where column = value)     * selectionArgs---为where中的占位符提供具体值     * groupBy  --- 指定需要group by 的列(group by column)     * having -- 对group by后的结果进行约束(having column = value)     * orderBy    指定查询结果的排序方式(order by column1,column2,,,)     * @param view     */    @OnClick(R.id.retrieve)    public void retrieveData(View view){        Cursor cursor = db.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(TAG , "book name is " + name);                Log.d(TAG , "book author is " + author);                Log.d(TAG , "book pages is " + pages);                Log.d(TAG , "book price is " + price);            }while (cursor.moveToNext());        }//if        cursor.close();    }}


现在基本操作就这样了,

记得自己去看SQLiteDatabase和SQLiteOpenHelper的源码略....


LitePal:


这是github上的开源库,稳定性强,操作简单,效率高等等

运用:

(1)在build.gradle(app)添加依赖:

compile 'org.litepal.android:core:1.5.1'
(2)在app/src/main下新建一个路径命名:assets,然后在该目录下创建xml文件litepal.xml

内容如下:

<?xml version="1.0" encoding="utf-8" ?><litepal><!--数据库名字.db--><dbname value = "BookStore"/><!--数据库版本,更新时改动版本--><version value = "1"/><!--这是自己新建的用于数据库存放表数据类型--><list>    <mapping class = "testsdcard.cai.maiyu.mdaima06_01.bean.Book"/></list></litepal>

无疑是指定数据库名字,版本,还有一个后面你自己创建的数据表类型(可以先不添加)

(3)在manifest中去配置:

在<application   

android:name="org.litepal.LitePalApplication"
.....

>

......

</application>

若是用自己的application也一样,记得在自己定义的application的onCreate方法中初始化:LitePal 。初始化(this);


(4)创建数据表类:继承DataSupport

public class Book extends DataSupport{    private int id;     //id    private String name;    //书名    private String author;  //作者    private int pages;      //页数    private double price;   //价格  //  private String press; //出版社//    public String getPress() {//        return press;//    }////    public void setPress(String press) {//        this.press = press;//    }    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 String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }    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;    }}

(5)Activity中使用:

public class TestLitePalActivity extends AppCompatActivity {    //创建数据库    @ViewInject(R.id.create_database)    private Button mBtnCreate;    //增加数据    @ViewInject(R.id.add)    private Button mBtnAdd;    //更新数据    @ViewInject(R.id.update)    private Button mBtnUpdate;    //删除数据    @ViewInject(R.id.delete)    private Button mBtnDelete;    //查询数据    @ViewInject(R.id.retrieve)    private Button mBtnRetrieve;    private static final String TAG = "TestLitePalActivity";    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_database);        ViewUtils.inject(this);    }    //创建数据库    @OnClick(R.id.create_database)    public void createDatabase(View view){        //获取数据库        LitePal.getDatabase();    }    /**     * 添加数据     * @param view     */    @OnClick(R.id.add)    public void addData(View view){        Book book = new Book();        book.setName("大话数据结构");        book.setAuthor("程杰");        book.setPages(516);        book.setPrice(43.00);        //book.setPress("Unknow");//增加出版社        book.save();    }    /**     * 删除数据     * @param view     */    @OnClick(R.id.delete)    public void deleteData(View view){        DataSupport.deleteAll(Book.class , "price < ?" , "60");    }    /**     * 更新数据     * @param view     */    @OnClick(R.id.update)    public void updateData(View view){        Book book = new Book();        book.setPrice(38.50);        book.updateAll("name = ? and author = ?" , "大话数据结构" , "程杰");//更新数据为默认值//        book.setToDefault("pages");//        book.updateAll();    }    /**     * 查询数据     * @param view     */    @OnClick(R.id.retrieve)    public void retrieveData(View view){        List<Book> books = DataSupport.findAll(Book.class);        for(Book book : books){            Log.d(TAG , "book name is " + book.getName());            Log.d(TAG , "book author is " + book.getAuthor());            Log.d(TAG , "book pages is " + book.getPages());            Log.d(TAG , "book price is " + book.getPrice());        }        //(2)添加限制:select--选定哪几列        //where--约束条件,   order--结果排序 ,limit---结果的数量        //offset---查询结果的便宜了offset(1)代表查询表中的从第2条开始//        List<Book> books = DataSupport.select("name" , "author" ,"pages")//                .where("pages > ?" , "600")//                .order("pages")//                .limit(10)//                .offset(10)//                .find(Book.class);        //(3)用原生数据库语句查询//        Cursor cursor = DataSupport.findBySQL("select * from Book where pages > ?" +//                " and price < ?" ,"700" ,"60");    }}

从代码中,对比SQLite,发现更简单,更方便,是不是呢?

(1)创建,更新,删除,增加,是不是更方便呢,

(2)而版本更新,只需要在litepal.xml中改版本号

(3)查询,之前要7个参数,现在利用DataSupport.findXXX就可以了

(4)记得创建数据表类要继承DataSupport类

(5)查询还支持多种查询,原生SQL语句查询,

。。。最后去看一下源码





0 0
原创粉丝点击