Android SQLite数据库存储

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();
这样删除和添加会同时执行,若添加不成功,则旧数据也不会成功删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值