android sqlite 创建数据库,表、增加数据、更新数据、删除数据
阅读原文时间:2021年04月20日阅读:1

今天学习了android 中内嵌的数据库sqlite,sqlite的简单介绍:

SQLite简介

Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也非常的强大。SQLite具备下列特点:

1.轻量级

使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。

2.独立性

SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。

3.隔离性

SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。

4.跨平台

SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。

5.多语言接口

SQLite 数据库支持多语言编程接口。

6.安全性

SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。

这几天一直再看mysql,所以看到数据库就感觉头疼,但是我还是坚持了下来

一、创建数据库

android 有个辅助类SQLiteOpenHelper让我们专门来管理数据库,SQLiteOpenHelper是一个抽象方法,意味着我们继承这个类要实现这两个方法分别是onCreate() onUpgrede()方法,还有两个实例方法getReadableDatabase() getWriteableDatabase(),这两个方法都可以创建或打开一个现有的数据库,并返回一个可对数据库读写的对象。

SQLiteOpenHelper的一般用少一点参数的构造方法:

SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version);

name为创建的数据库的名称,factory一般为null 具体用法有待深入研究,version为数据库的版本,初次设置为1。关于数据库的版本,个人理解为初次创建数据库版本为1,增添删除数据不会影响版本,当你要运行onUpgrede()方法来更新表的时候你需要把版本设置的比之前高,否则不能正常更新数据库的表。例如初始版本为1,现在要增加一个新的表,version改为2即可。还有如果本地的数据库版本为4,你构造函数的数据库版本为3会报“Can't downgrade database from version 4 to 3”的错误,所以要注意版本的变化。

mysql类代码

public class MySql extends SQLiteOpenHelper{
    private static final String CREATE_BOOK = "create table Book("
            +"id integer primary key,"
            +"author text,"
            +"price real,"
            +"pages integer,"
            +"name text)";
    private Context mContext;
    public MySql(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);
        Log.i("create", "create");
        Toast.makeText(mContext,"create",Toast.LENGTH_SHORT).show();
    }
}

MainActivity类代码

public class MainActivity extends ActionBarActivity {
    private Button btn,btn1,btn2,btn3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final MySql mySql = new MySql(this,"BookStore",null,5);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("btn","btn");
                mySql.getWritableDatabase();
            }
        });
}

在Mysql的onCreate方法中执行db.execSQL(String sql);sql为创建表的sql语句。

实例化Mysql之后通过执行getWritableDatabase()创建数据库,第一次运行getReadableDatabase() getWriteableDatabase()方法时会执行SQLiteOpenHelper的onCreate方法。通过adb进入data文件下的databases可以看到数据库BookStroe创建


借助sqlite命令打开 键入sqlite3 BookStroe进入sqlite,输入.table 可以看到创建的表Book。输入查询语句select * from Book;

什么都没有,因为还没插入数据。这样,数据库、表创建完毕下面插入数据。

二、插入数据

前面说了调用SQLiteOpenHelpergetReadableDatabase() getWriteableDatabase()方法创建、升级数据库,同时这两个方法还会返回一个SQLliteDatabase对象,借助这个对象可以完成插入、更新、删除等操作。

更改下MainActivity代码

btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mySql.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("id","1");
                values.put("name","the sy");
                values.put("author","dan");
                values.put("pages",454);
                values.put("price",16.96);
                db.insert("Book", null, values);
                values.clear();
                values.put("id","2");
                values.put("name","the sy1");
                values.put("author","dan1");
                values.put("pages",4541);
                values.put("price",16.961);
                db.insert("Book",null,values);
            }
        });

创建一个add Button,在按钮里增加添加数据的相应。首先获取到SQLliteDatabase对象db,之后创建一个ContentValues对象values存放sql,,values.put("str1","str2")put为向其中添加数据,str1位表中的字段名,str2位向该字段名插入的数据。values构造完成后调用SQLliteDatabase的insert方法,该方法接收3个参数,第一个参数为表名,第二个参数一般不用,直接null,第三个参数为ContentValues对象。运行之后按下add按钮,在adb中键入select * from Book;看到显示

数据上传成功。

三、更新数据

<pre name="code" class="java">btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mySql.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price",11);
                db.update("Book",values,"name=?",new String[]{"the sy"});

            }
        });

也是获得一个SQLliteDatabase对象db,调用SQLliteDatabase的方法update,该方法接收3个参数,第一个参数为表的名字,第二个参数为ContentValues对象,第三个参数为sql查询的where部分,?为一个占位符,接收第四个参数传来的数据,上面意思是查找name为“the sy”的数据,将其price改为11。运行按下btn2,查看数据库

数据更新成功

三、删除数据

<pre name="code" class="java">btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mySql.getWritableDatabase();
                ContentValues values = new ContentValues();
                db.delete("Book","pages>?",new String[]{"500"});

            }
        });

获得一个SQLliteDatabase对象db,调用SQLliteDatabase的方法delete,该方法接收三个参数,第一个为表的名字,第二个参数为sql查询的where部分,?为一个占位符,接收第三个参数传来的数据,上面意思为删除pages大于500的数据。运行按下btn3,查看数据库


成功删除

四、数据库、表的更新

更新数据库时需要调用onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)方法  oldVersion为更新之前的数据库版本,newVersion为更新之后新的数据库的版本,要调用该函数需要在实例化SQLiteOpenHelper的时候把版本该的比之前打1就可以

比如现在我想删除Book表,onUpgrade可以这样写

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
    }

同时记得更新数据库的版本,运行后Book表将会被删除。

这种数据库更新方法比较粗暴,我再第一行代码上看到一种不错的解决方案。

五、查找数据

通过SQLliteDatabase的query方法执行并返回cursor对象来查找

<span style="white-space:pre">        </span>SQLiteDatabase db = mySql.getWritableDatabase();
                Cursor cursor = db.query("Test",null,null,null,null,null,null);
                if(cursor.moveToFirst()){
                    for(int i=0;i<cursor.getCount();i++){
                        cursor.move(i);
                        Log.i("query","id"+cursor.getInt(cursor.getColumnIndex("id"))+"   author"+curs<span style="white-space:pre">                </span>or.getString(cursor.getColumnIndex("author"))
                        );
                    }
                }

cursor.move()移动到表中的第几行

最近才开始慢慢写博客,真的是累啊
不过看自己写出来的还是很高兴哒~  不BB了继续去写了。。