Android SQLite数据库存储

Android为了让我们方便的管理数据库,提供了一个SQLiteOpenHelper帮助类,借助这个类可以对数据库进行创建和升级.

SQLiteOpenHelper是一个抽象类,我们要创建一个自己的帮助类去继承它.SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade().我们必须要重写这两个方法,然后分别在这两个方法中实现创建、升级数据库的逻辑.

SQLiteOpenHelper的用法: 先创建一个数据库文件,里面写你的建表语句,然后新建一个自己的帮助类来继承SQLiteOpenHelper类,在里面实现建表:

建表示例代码:

public class MyDatabaseHelp extends SQLiteOpenHelper {
   public  static  final String CREATE_BOOK = "CREATE TABLE Book(\n" +
           "    ID INTEGER PRIMARY KEY autoincrement,\n" +
           "     author text,\n" +
           "     price REAL,\n" +
           "     pages INTEGER,\n" +
           "     name text" +
           "     category_id INTEGER);" ;

    public  static final String CREATE_CATEGORY = "CREATE TABLE category(\n" +
            "    ID INTEGER PRIMARY KEY autoincrement,\n" +
            "    category_name text,\n" +
            "    category_code INTEGER);";

    private Context mContext;
    public MyDatabaseHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext,"create success",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //注意每个case都不break,保证每个版本都会执行所有case
        switch (oldVersion){
            case 1:
                db.execSQL(CREATE_CATEGORY);
            case 2:
                db.execSQL("alter table book add column category_id INTEGER");

        }
    }
}

在MainActivity中的onCreate()的方法中:

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

        //创建表
        create_btn = (Button) findViewById(R.id.create_btn);
        myDatabaseHelp = new MyDatabaseHelp(this,"BookStore.db",null,1);//指定数据库的名称,1代表版本号
        create_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myDatabaseHelp.getWritableDatabase();//用于创建和升级数据库
                Toast.makeText(MainActivity.this,"create database success",Toast.LENGTH_SHORT).show();
            }
        });
  }

添加数据:

SQLiteOpenHelper中提供了一个insert()方法,这个方法就是专门用于添加数据的,接收三个参数,第一个是表名,第二个是用于在未指定添加数据的情况下给某些可为空的列自动赋值Null,第三个参数是一个ContentValues对象,它提供一系列的put()方法重载,用于向ContentValues中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可.

添加数据的示例代码:

 //添加操作
        addData_btn = (Button) findViewById(R.id.insert_btn);
        addData_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             SQLiteDatabase sdb =  myDatabaseHelp.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put("author","superzhao");
                contentValues.put("price",10);
                contentValues.put("pages",300);
                contentValues.put("name", "Android");
                sdb.insert("book", null, contentValues);
                contentValues.clear();
                contentValues.put("author","steve");
                contentValues.put("price",100);
                contentValues.put("pages", 3000);
                contentValues.put("name", "Java");
                sdb.insert("book",null,contentValues);
            }
        });

更新数据方法:

SQLiteDatabase中也提供了一个update()方法用于对数据的更新,接收四个参数,第一个参数是表名,第二参数是ContentValues对象,要把更新数据在这里组装进去.第三、四个参数用于约束更新的行数,不指定就是更新所有行.

更新示例代码:

//更新操作
        update_btn = (Button) findViewById(R.id.update_btn);
        update_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase sdb = myDatabaseHelp.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put("price",200);
                sdb.update("book",contentValues,"name = ?",new String[]{"Android"});
            }
        });

删除操作:

SQLiteDatabase中也提供了一个delete()方法专门用于删除数据,接收三个参数,第一个是表名,第二个和第三个是约束删除某一行或某几行的数据,不指定就是删除所有行.

删除操作示例代码:

//删除操作
        delete_btn = (Button) findViewById(R.id.delete_btn);
        delete_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase sdb = myDatabaseHelp.getWritableDatabase();
                sdb.delete("book","pages>?",new String[]{"500"});
            }
        });

查询数据

SQLiteDatabase中也提供了一个query()方法用于对数据进行查询,最短的一个方法重载也要七个参数,第一个是表名,第二个是用于指定去查询哪几列,第三个和第四个用于去约束查询某一行或某几行的数据,第五个用于指定需要group by的列,第六个用于对group by之后的数据进行进一步的过滤,第七个用于指定查询结果的排序方式.

调用query()方法会返回一个Cursor对象,查询到的所有数据都会从这个对象中取出.

查询示例代码:

//查询操作
        select_btn = (Button)findViewById(R.id.select_btn);
        select_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase sdb = myDatabaseHelp.getWritableDatabase();
                Cursor cursor =  sdb.query("book", null, null, null, null, null, null);
                if(cursor.moveToFirst()){
                    do{
                        //遍历cursor对象
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        float price = cursor.getFloat(cursor.getColumnIndex("price"));
                        int page = cursor.getInt(cursor.getColumnIndex("pages"));
                        //输出到日志
                        Log.d("MainActivity","book name is " + name );
                        Log.d("MainActivity","book author is " + author );
                        Log.d("MainActivity","book price is " + price );
                        Log.d("MainActivity","book page is " + page );
                    }while (cursor.moveToNext());
                }
                cursor.close();
            }
        });

SQLite中使用事务

先调用SQLiteDatabase的beginTransaction()方法来开启一个事务,然后在一个异常捕获的代码块中去执行具体的数据库操作,当所有的操作都完成之后,调用setTransactionSucc()表示事务已经执行成功了,最后在finally中调用endTransaction()来结束事务.

应用事务代码示例:

//更新数据(事务的应用)
        replace_btn = (Button) findViewById(R.id.replace_btn);
        replace_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase sdb = myDatabaseHelp.getWritableDatabase();
                sdb.beginTransaction();//开启一个事务
                try{
                    sdb.execSQL("delete from book where author = ?",new String[]{"superzhao"});
                    if(true){
                        //这里手动抛出一个异常,注释掉事务就可以成功执行,否则事务不成功执行
                        throw new NullPointerException();
                    }
                    sdb.execSQL("insert into book values(?,?,?,?,?)"
                            ,new String[]{"1","superzhao","2000","1000","jack and jerry"});
                    sdb.setTransactionSuccessful();//标记事务成功
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    sdb.endTransaction();//结束事务
                }

            }
        });

关于Android的其他几种存储方式写在另一篇博文中了,有兴趣的可以去看看.
http://blog.csdn.net/zc1994113/article/details/50452866

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值