Android开发-java版:SQLite数据库

一、SQLite数据库介绍

Android内置SQLite数据库,是一款轻量级关系数据库。

Android内置SQliteOpenHelper帮助类,想要使用,我们需要自己创建类去继承它,借助这个类可以对数据库进行创建升级。

它有两个方法onCreate()和onUpgrade()我们要自己重写,然后分别在这两个方法中实现创建,升级数据库的逻辑。

还有非常重要两个实例方法:getReadableDatabase()和getWritableDatabase(),这两个方法都可以创建或打开一个现有的数据库(如果已存在则直接打开,否则创建一个新的数据库)并返回一个可对数据库进行读写操作的对象。

当数据库不可写入时(如磁盘空间已满)

getReadableDatabase()方法返回的对象将以只读的方式去打开数据库

getWritableDatabase()方法则将出现异常

二、在数据库里创建表

1.首先创建一个类继承SQLiteOpenHelper类

2.定义了一个常量,包含了建表的SQL语句,给id字段定义主键和自增属性

3.由于父类中没有无参构造函数,所以必须显式调用父类的构造函数,然后保存上下文

4.重写onCreate()方法,对应创建表

java 复制代码
public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "Create table Book("
            + "id integer primary key autoincrement,"
            + "author text,"
            + "price real,"
            + "pages integer,"
            + "name text)";
    private Context mContext;

    public MyDatabaseHelper(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);
        Toast.makeText(mContext,"succeed",Toast.LENGTH_LONG).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

5.然后在活动的布局文件中定义一个按钮,在活动文件中给这个按钮绑定监听器,调用getWritableDatabase()方法创建数据库

java 复制代码
public class MainActivity extends AppCompatActivity {

    private Button button;
    private MyDatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        dbHelper = new MyDatabaseHelper(this,"BookStore.dp",null,1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });
    }
}

6.运行后点击按钮,由于我们给这个数据库设置了名字为:BookStore.dp,可以在Device Explorer中看到这个文件,路径为:data->data->com.example.(你的项目名)->databases->BookStore.dp

7.右键保存到桌面,然后在Android Studio中增加插件,Plugins中搜索Database Navigator并下载,然后在这里面打开刚刚保存的文件即可看到表。

三、数据库升级

1.新增一个常量传入创建另一张表的sql语句

2.onCreate方法里创建这张表

3.修改传入的版本号,从1改为2

java 复制代码
public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "Create table Book("
            + "id integer primary key autoincrement,"
            + "author text,"
            + "price real,"
            + "pages integer,"
            + "name text)";
    public static final String CREATE_CATEGORY = "Create table Category("
            + "id integer primary key autoincrement,"
            + "category_name text,"
            + "category_code integer)";
    private Context mContext;

    public MyDatabaseHelper(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,"succeed",Toast.LENGTH_LONG).show();
    }

    @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);
    }
}
java 复制代码
dbHelper = new MyDatabaseHelper(this,"BookStore.dp",null,2);

即可触发onUpgrade方法

四、添加数据

我们对数据进行的操作有4种,即CRUD

C代表添加(Create),R代表(Retrieve),U代表更新(Update),D代表删除(Delete),每一种操作又各自对应了一种SQL命令。

添加数据时使用insert,查询数据时使用select,更新数据时使用update,删除数据时使用delete

Android提供了一系列辅助性方法,使得在Android中即使不去编写SQL语句,也可以轻松完成。

前面我们已经知道,调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法可以用于创建和升级数据库,不仅如此,这两个方法还都会返回一个SQLiteDatabase的对象,借助这个对象就可以进行CRUD操作了。

SQLiteDatabase中提供了一个insert()方法,这个方法就是专门用于添加数据的,它接收3个参数

第一个参数是表名,我们希望向哪张表里添加数据,这里就传入该表的名字

第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,一般我们用不到这个功能,直接传入null

第三个参数是一个ContentValues对象,它提供了一系列的put()方法重载,用于向ContentValues中添加数据

只需要将表中的每个列名以及相应的待添加数据传入即可

java 复制代码
button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("name","1");
                values.put("author","Dan");
                values.put("pages",45);
                values.put("price",15);
                db.insert("Book",null,values);
            }
        });

五、更新数据

使用update方法,第一个参数是表名,第二个参数是更新的数据,第三个参数是要更新哪几行,第四个参数为占位符"?"提供了具体的参数,这里的意思是,更新name=1的那一行

java 复制代码
button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price",10);
                db.update("Book",values,"name = ?",new String[]{"1"});
            }
        });

六、删除数据

delete方法,第一个参数为表名,第二个和第三个参数共同指定哪一行,可以传null,代表删除所有数据(慎用)

java 复制代码
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                db.delete("Book","name = ?",new String[]{"2"});
            }
        });

七、查询数据

SQLiteDatabase中给出了query()方法,但是参数最少都需要7个

第一个参数表名,第二个参数指定查询哪几列,第三、四个参数用于约束查询某几行的数据,第五个参数指定需要去group by的列,第六个参数用于对group by数据进行进一步过滤,第七个参数指定排序方式

java 复制代码
public class MainActivity extends AppCompatActivity {

    private Button button,button1,button2;
    private MyDatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button1 = (Button) findViewById(R.id.add);
        button2 = (Button) findViewById(R.id.upgrade);
        dbHelper = new MyDatabaseHelper(this,"BookStore.dp",null,2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("name","1");
                values.put("author","Dan");
                values.put("pages",45);
                values.put("price",15);
                db.insert("Book",null,values);
                values.clear();
                values.put("name","2");
                values.put("author","Dan");
                values.put("pages",45);
                values.put("price",15);
                db.insert("Book",null,values);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
//                ContentValues values = new ContentValues();
//                values.put("price",10);
//                db.update("Book",values,"name = ?",new String[]{"1"});

//                db.delete("Book","name = ?",new String[]{"2"});

                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("MainActivity","book name is"+name);
                        Log.d("MainActivity","book author is"+ author);
                        Log.d("MainActivity","book pages is" + pages);
                        Log.d("MainActivity","book price is"+ price);
                    }while (cursor.moveToNext());
                }
                cursor.close();
            }
        });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });
    }
}
相关推荐
星辰9 分钟前
Ijkplayer重新编译支持h264裸流
android
吃好睡好便好11 分钟前
说说科学爬山
学习·生活
道一2312 分钟前
Windows系统查看端口占用进程的3种实用方法
windows·笔记
小二·14 分钟前
Redis 内存溢出(OOM)排查与恢复实战
数据库·redis·bootstrap
pqk6V6Vep14 分钟前
Redis 分布式锁进阶第一篇讲解
数据库·redis·分布式
giaz14n9X31 分钟前
Redis 分布式锁进阶第六十一篇
数据库·redis·分布式
是一个Bug36 分钟前
MongoDB:像搭积木一样存数据
数据库·mongodb
测试开发-学习笔记38 分钟前
Android studio安装
android·ide·android studio
宋拾壹39 分钟前
同时添加多个类目
android·开发语言·javascript
lunzi_08261 小时前
【学习笔记】《Python编程 从入门到实践》第8章:函数定义、参数传递与模块导入
笔记·python·学习