在Android开发的成长中,数据库是我们必须要掌握的,android数据库操作的方式有很多种,但没有接触过SQL操作的同学,建议从SQLite学起,自己掌握了数据库的操作流程才是本,是根。一味滥用开源库并不是我们开发的初衷。接下来是本人观摩《第一行代码》的理解。如有不正,请指出。
首先新建一个项目,然后看我们的目录结构,很简单的
首先我们要新建一个类MyDatabaseHelper,去继承SQLiteOpenHelper,重写它的两个抽象方法;
package com.mydemo.mydemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Administrator on 2018/2/28.
*/
public class MyDatabaseHelper extends SQLiteOpenHelper{
//参数分别是:Context,数据库名,Cursor,数据库版本号
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//创建表方法
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
//升级数据库版本方法
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
然后我们需要一个建表的SQL语句,先上代码:
package com.mydemo.mydemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by Administrator on 2018/2/28.
*/
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;
//参数分别是:Context,数据库名,Cursor,数据库版本号
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext=context;
}
//创建表方法
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show();
}
//升级数据库版本方法
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
建表语句其实很好理解,就是把SQL语句转化成字符串的形式,SQL的语句是这样的
create table Book(
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
接着我们的MainActivity和xml文件也要修改,添加一个创建表的按钮:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.mydemo.mydemo.MainActivity">
<Button
android:id="@+id/create_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="创建表" />
</LinearLayout>
package com.mydemo.mydemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
private Button btnCreate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//参数分别是:Context,数据库名,Cursor,数据库版本号
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); btnCreate.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) { myDatabaseHelper.getWritableDatabase(); } }); }
private void initView() {
btnCreate =findViewById(R.id.create_database); }}
getWritableDatabase()方法我的理解是打开写入数据库的方法,getReadableDatabase()方法是读取数据库的方法;
查看我们创建成功的表我们用cmd命令的方式去查看,配置好sdk环境变量,不知道的可以百度一下或者(右键计算机—属性—高级系统设置—环境变量,然后在系统变量里找到Path并点击编辑,将sdk的platform-tools目录配置进去)
cmd命令就直接上图了
到这里我们就把表创建出来了。我们还可以升级我们的数据库
package com.mydemo.mydemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by Administrator on 2018/2/28.
*/
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;
//参数分别是:Context,数据库名,Cursor,数据库版本号
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext=context;
}
//创建表方法
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show();
}
//升级数据库版本方法
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
}
}
MainActivity把对应的版本号2修改成3就行
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 3);
在查看有没有升级成功,对应刚刚的命令
接下来进行我们的数据库增删改查,先一步步来,添加我们的增加数据的按钮
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
//开始组装第一条数据
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values);
values.clear();
//开始组装第二条数据
values.put("name", "The Lost Symbol");
values.put("author", "Dan Brown");
values.put("pages", 510);
values.put("price", 19.95);
db.insert("Book", null, values);
values.clear();
db.close();
}
});
这里为了减少篇幅,只上核心代码,添加控件,找id这些我就不粘贴了,跟着第一个按钮后面写或者自己定义也是可以的;insert()方法有三个参数,第一个是表的名字,第二个是用于在未指定添加数据的情况下给某些可为空的列自动赋值null,我们一般不用,直接传null就行了,第三个参数是一个ContentValues对象,它提供一系列的put()方法重载,用于向ContentValues中添加数据;
点击增加数据按钮之后我们可以继续查看是否添加数据成功:
我们查看添加的内容用SQL查询语句 select * from Book; (这里主要别忘了分号)
接下来我们可以看看怎么更新数据库里面的内容
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 9.9);
db.update("Book", values, "name=?", new String[]{"The Da Vinci Code"});
values.clear();
db.close();
}
});
update()方法有4个参数,我们用第三,第四个参数指定具体更新的位置,第三个参数对应的是SQL语句的where部分,可以这样理解:“name等于哪个”,然后第四个参数就是具体的哪个;
可以看到我们的加钱成功修改成9.9了,这样我们就完成了更新的操作了;接下来我们进行删除操作:
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=myDatabaseHelper.getWritableDatabase();
db.delete("Book","pages > ?",new String[]{"500"});
db.close();
}
});
删除操作更容易理解了,第二,第三个参数也是用来约束删除某行或者某几行的数据,不指定的话就是删除所有行。第二个参数还是这样理解:“pages > ?”,然后第三个参数就是具体的 ? ;
看到我们已经把pages>500的删除掉了,到这里是不是感觉并没有那么不好理解呀,其实cmd命令和sql语句敲多了也就明白了;
接着我们要开始最后的查询方法了:
btnQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db=myDatabaseHelper.getReadableDatabase();
//查询Book表中的所有数据
Cursor cursor=db.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"));
int pages=cursor.getInt(cursor.getColumnIndex("pages"));
double price=cursor.getDouble(cursor.getColumnIndex("price"));
Log.e("MainActivity", "Book name is "+name);
Log.e("MainActivity", "Book author is "+author);
Log.e("MainActivity", "Book pages is "+pages);
Log.e("MainActivity", "Book price is "+price);
}while(cursor.moveToNext());
}
cursor.close();
}
});
最后的query()方法的参数比较多,至少也要传入7个参数,第一个参数还是表名,
第二个参数用于指定去查询哪几列,不指定的话就默认全部,
第三第四个参数用于用于约束查询的行,不指定的话也是查询全部行,
第五个参数用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作,
第六个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤,
第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式,
还有其他几个query()方法的重载其实大同小异,有兴趣可以自己看看;
这里我们用log的方式打印出来
到这里相信大家对android的sqlite操作也有相当的了解了。