Android SQLite数据库存储

来源:互联网 发布:mac无法拷入移动硬盘 编辑:程序博客网 时间:2024/04/29 22:33

SQLite数据库是Android系统的内置数据库,是一款轻量级的Android数据库,它的运算速度非常快。一般在存储大量的复杂的关系型数据的时候进行使用。

Android 提供了SQLiteOpenHelper帮助类对SQLite数据库进行简单的创建跟升级,并且SQLiteOpenHelper类是一个抽象类,需要自己创建一个类继承这个类,其中有两个抽象方法 onCreate()以及onUpgrade(),必须在我们自己的帮助类中重写这两个方法。SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase(),这两个方法都可以创建或者打开一个现有的数据库,数据库已存在就直接打开,数据库不存在就创建,并返回一个可对数据库进行读写操作的对象。当数据库不可写入的时候,只能使用getReadableDatabase()方法打开数据库,否则就会出现异常。

创建一个数据库的SQLite语句如下(一个名为BookStore的数据库,以及一个名为Book的表):

create table Book(

id integer primary key autoincrement,

author text,

price real,

pages integer)

注:integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型。primary key将id设置为主键,autoincreament则表示id是自增长的,入库时会自动生成,不需要手动赋值。同时需要在代码中执行这个SQL语句,完成创建表的操作。

1.这里创建一个MyDatabaseHelper继承自SQLiteOpenHelper

public class MyDatabaseHelper extends SQLiteOpenHelper {    private Context mcontext;    private static final String CREATE_BOOK="create table Book("+            "author text,"+            "pages integer,"+            "price real,"+            "name real)";//创建一个Book    private static final String CREATE_CATEGORY="create table Category("+            "id integer primary key autoincrement,"+            "category_name text,"+"category_code integer)";//创建另一个category    public MyDatabaseHelper(Context context, String name,                            CursorFactory factory, int version) {        super(context, name, factory, version);        //重写四个参数的构造函数,第一个参数是context,用于对数据库进行操作。        // 第二个参数是数据库的名字,我们预先定义的是BookStore        // 第三个参数是查询数据的时候返回一个自定义的Cursor,一般都是传入null值。        // 第四个参数是当前数据库的版本号,用于对数据库进行升级。        // TODO Auto-generated constructor stub        mcontext=context;    }    @Override    public void onCreate(SQLiteDatabase db) {        // TODO Auto-generated method stub        db.execSQL(CREATE_BOOK);//执行建表语句。    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {        // TODO Auto-generated method stub               }    }}

    在执行完getReadableDatabase()(或者getWritableDatabase())方法之后,此时并没有BookStore.db这个数据库,因此会创建这个数据库并且调用MyDatabaseHelper的onCreate()方法,onCreate()方法只有在第一次创建数据库时才会调用。如果此时我希望在数据库中再次加入category这个表,那么只能在onUpgrade()方法中进行修改,加入

public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {    // TODO Auto-generated method stub    db.execSQL(CREATE_CATEGORY);
同时修改版本号,版本号改变,重新运行才能调用onUpgrade()方法,如下。

dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);
这样重新运行,category表就能插入到数据库当中了。

2.设置四个按钮,对数据进行操作,即CRUD,C添加(Create),R查询(Retrieve),U更新(Update),D删除(Delete)。分别对应相应的SQL语句为,添加insert,查询select,更新update,删除使用delete。

xml文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:context="com.example.test.test.MainActivity"    tools:showIn="@layout/activity_main">    <Button        android:id="@+id/add_data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Add to book"/>    <Button        android:id="@+id/update_data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Update book" />    <Button        android:id="@+id/delete_data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Delete from book" />    <Button        android:id="@+id/query_data"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Query from book" /></RelativeLayout>
3.在MainActivity中进行点击事件的添加跟处理。

public class MainActivity extends AppCompatActivity {    private MyDatabaseHelper dbHelper;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,1);        Button addDatabase=(Button)findViewById(R.id.add_data);        Button updateDatabase=(Button)findViewById(R.id.update_data);        Button deleteDatabase=(Button)findViewById(R.id.delete_data);        Button queryDatabase=(Button)findViewById(R.id.query_data);        addDatabase.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                SQLiteDatabase db=dbHelper.getWritableDatabase();                ContentValues values=new ContentValues();//对要添加的数据进行组装                values.put("name","The King");                values.put("author", "Mating");                values.put("pages", "10224");                values.put("price", "89.9");                db.insert("Book",null,values);//三个参数,第一个参数为表名。第二个参数为未指定数据的情况下,               // 对可为空的列自动赋值为null。第三个参数为ContentValues对象。//              values.clear();//如果需要插入多条数据,则需要调用clear()清空上一条数据。            }        });        updateDatabase.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                SQLiteDatabase db=dbHelper.getWritableDatabase();                ContentValues values=new ContentValues();                values.put("price",100.99);                //四个参数。第一个参数是表名,                // 第二个参数是ContentValues对象,第三个参数为更新哪一行,即where name=aaaa中的name,第四                  个参数为所要修改的内容                               db .update("Book",values,"name=?",new String[]{"The King"});            }        });        deleteDatabase.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                SQLiteDatabase db=dbHelper.getWritableDatabase();                db.delete("Book", "pages>?", new String[]{"500"});//参数同上,不需要ContentValues对象            }        });        queryDatabase.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                SQLiteDatabase db=dbHelper.getWritableDatabase();                Cursor cursor=db.query("Book", new String[]{"name","pages"},"price=?and author=? ",new                String[]{"89.9","Mating"},null,null,null);                if(cursor.moveToFirst()){//将指针移动到第一行,判断当前的Cursor对象是否有数据。                    do{                        String name=cursor.getString(cursor.getColumnIndex("name"));                        int pages=cursor.getInt(cursor.getColumnIndex("pages"));                        Log.d("name is", name);                        Log.d("pages is", pages+"");                    }while(cursor.moveToNext());                    cursor.close();                }            }        });    }}
4.如果我们希望能够将删除数据跟添加数据绑定在一起,还可以使用一个事务。即

SQLiteDatabase db=dbHelper.getWritableDatabase();db.beginTransaction();db.delete("Book",null,null);ContentValues values=new ContentValues();values.put("name","The Tom");values.put("author", "Tom");values.put("pages", "10278");values.put("price", "67.9");db.insert("Book",null,values);db.setTransactionSuccessful();db.endTransaction();
这样删除和添加会同时执行,若添加不成功,则旧数据也不会成功删除。

0 0
原创粉丝点击