目录
一、创建数据库
Android 为了让我们更好的管理数据库,提供了一个SQLiteOpenHelper的帮助类(注意该类是抽象类,因此我们需要创建自己的帮助类),该类有两个抽象方法onCreate()和onUpdate(),这两个方法都需要我们在自己的帮助类中重写,分别实现创建数据库和更新数据库。此外,SQLiteOpenHelper类还有两个重要的实例方法,getReadableDatabase()和getWritableDatabase(),这两个方法都可以打开或创建数据库,获取数据库对象并进行读写操作。
下面是创建数据库的帮助类:
public class MyDatabaseHelper extends SQLiteOpenHelper {
private final Context mContext;
// 用sql语句创建学生信息表
public static final String CREATE_STUDENT_MGS = "create table StudentMgs ("
+"id integer primary key autoincrement,"
+"name varchar(30),"
+"sex varchar(5),"
+"age integer)";
/**
* @param context 用于查找数据库的路径
* @param name 数据库的名称
* @param factory 用于创建游标对象,或 null 表示默认对象
* @param version 数据库的版本
*/
public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/**
* 该方法是创建数据库
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
// 调用execSQL执行sql语句
db.execSQL(CREATE_STUDENT_MGS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
注意:primary key 是 id列 的主键, autoincrement关键字表示id列是自增长的。
下表是Sqlite的数据类型:
数据类型 | |
null | 这个值为空值 |
varchar | 长度不固定且其最大长度为 n 的字串,n不能超过 4000。 |
text | 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE). |
integer | 值被标识为整数 |
real | 表示浮点型 |
blob | 表示二进制型 |
data | 包含了 年份、月份、日期。 |
time | 包含了 小时、分钟、秒。 |
char | 长度固定为n的字串,n不能超过 254。 |
创建布局文件:就一个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/createDatabase"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"/>
</LinearLayout>
下面是MainActivity的代码:
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = this.findViewById(R.id.createDatabase);
myDatabaseHelper = new MyDatabaseHelper(this,"StudentMgs.db",null,1);
// 数据库可视化
SQLiteStudioService.instance().start(this);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建数据库
myDatabaseHelper.getWritableDatabase();
Toast.makeText(getApplicationContext(),"数据库创建成功",Toast.LENGTH_LONG).show();
}
});
}
}
测试结果:
点击按钮,数据库创建成功了
查看sqlitestudio
数据库可视化操作可以看下面:SQLite数据库可视化操作软件|SQLite Studio操作|Android Studio_哔哩哔哩_bilibili
二、更新数据库
第一步:到我们的帮助类中重写onUpgrade()方法。
/**
* 该方法用来更新数据
* @param db 数据库对象
* @param oldVersion 数据库旧版本
* @param newVersion 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 在学生的信息表中增加一列手机号
String sql = "alter table StudentMgs add phone integer";
db.execSQL(sql);
}
第二步:到MainActivity中的数据库的版本号改为大于1的即可。
// 更新数据库
myDatabaseHelper = new MyDatabaseHelper(this,"StudentMgs.db",null,2);
测试结果:
三、数据库的增删改查
总布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/createDatabase"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"/>
<Button
android:onClick="addData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="增加数据"/>
<Button
android:onClick="delData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"/>
<Button
android:onClick="updateData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新数据"/>
<Button
android:onClick="queryData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"/>
</LinearLayout>
在MainActivity中加入addData()、delData、updateData()、queryData()四个方法即可
一、添加数据
用数据库对象调用public long insert(String table, String nullColumnHack, ContentValues values)方法。该方法的返回值是插入了多少行数据的行数。
table | 数据库中的表名 |
nullColumnHack | 一般写null |
values | 映射包含行的初始列值,键应该是列名,值应该是列值 |
public void addData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 2、添加第一条数据
values.put("name","张三");
values.put("sex","男");
values.put("age",18);
values.put("phone",110120119);
// 3、增加数据
db.insert("StudentMgs",null,values);
// 调用clear()方法将值清空
values.clear();
// 添加第二条数据
values.put("name","李四");
values.put("sex","男");
values.put("age",23);
values.put("phone",1234567890);
db.insert("StudentMgs",null,values);
Toast.makeText(getApplicationContext(),"数据增加成功",Toast.LENGTH_LONG).show();
}
测试结果:
二、删除数据
用数据库对象调用public int delete(String table, String whereClause, String[] whereArgs)
方法。该方法返回值是删除了多少行数据的行数。(下面的例子是删除名字为张三的学生)
table | 数据库表名 |
whereClause | 删除数据的条件 |
whereArgs | 您可以在 where 子句中包含 ?,该子句将被 whereArgs 中的值替换。这些值将绑定为字符串。(条件的值) |
public void delData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
// 2、删除数据
db.delete("StudentMgs","name = ?",new String[]{"张三"});
}
测试结果:
三、更改数据
用数据库对象调用public int update(String table, ContentValues values, String whereClause, String[] whereArgs),该方法返回值是更改了多少行数据的行数。(下面是是更改名为李四同学的数据)
table | 数据库表名 |
whereClause | 更新数据的条件 |
whereArgs | 您可以在 where 子句中包含 ?,该子句将被 whereArgs 中的值替换。这些值将绑定为字符串。(条件的值) |
public void updateData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
// 2、创建值对象
ContentValues values = new ContentValues();
values.put("sex","女");
values.put("age",60);
// 3、更新数据
db.update("StudentMgs",values,"name = ?",new String[]{"李四"});
}
测试结果:
四、查询数据
用数据库对象调用public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having,String orderBy),该方法返回一个 Cursor 对象,它位于第一个条目之前(下面是查询所有数据)
各个参数的意思:
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
columns:要查询出来的列名。相当于select语句select关键字后面的部分。
selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:相当于select语句groupby关键字后面的部分
having:相当于select语句having关键字后面的部分
orderBy:相当于select语句orderby关键字后面的部分
@SuppressLint("Range")
public void queryData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getReadableDatabase();
// 2、查询所有数据
Cursor cursor = db.query("StudentMgs",null,null,null,null,null,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
int phone = cursor.getInt(cursor.getColumnIndex("phone"));
Log.d("MainActivity", "The student name is "+name);
Log.d("MainActivity", "The student sex is "+sex);
Log.d("MainActivity", "The student age is "+age);
Log.d("MainActivity", "The student phone is "+phone);
}
// 关闭游标
cursor.close();
}
测试结果:
MainActivity的源码:
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.sqlitetest.MyDatabaseHelper.MyDatabaseHelper;
import pl.com.salsoft.sqlitestudioremote.SQLiteStudioService;
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = this.findViewById(R.id.createDatabase);
// 更新数据库
myDatabaseHelper = new MyDatabaseHelper(this,"StudentMgs.db",null,2);
// 数据库可视化
SQLiteStudioService.instance().start(this);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建数据库
myDatabaseHelper.getWritableDatabase();
Toast.makeText(getApplicationContext(),"数据库创建成功",Toast.LENGTH_LONG).show();
}
});
}
public void addData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 2、添加第一条数据
values.put("name","张三");
values.put("sex","男");
values.put("age",18);
values.put("phone",110120119);
// 3、增加数据
db.insert("StudentMgs",null,values);
// 调用clear()方法将值清空
values.clear();
values.put("name","李四");
values.put("sex","男");
values.put("age",23);
values.put("phone",1234567890);
db.insert("StudentMgs",null,values);
Toast.makeText(getApplicationContext(),"数据增加成功",Toast.LENGTH_LONG).show();
}
public void delData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
// 2、删除数据
db.delete("StudentMgs","name = ?",new String[]{"张三"});
Toast.makeText(getApplicationContext(),"数据删除成功",Toast.LENGTH_LONG).show();
}
public void updateData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
// 2、创建值对象
ContentValues values = new ContentValues();
values.put("sex","女");
values.put("age",60);
// 3、更新数据
db.update("StudentMgs",values,"name = ?",new String[]{"李四"});
Toast.makeText(getApplicationContext(),"数据更改成功",Toast.LENGTH_LONG).show();
}
@SuppressLint("Range")
public void queryData(View view){
// 1、获取数据库对象
SQLiteDatabase db = myDatabaseHelper.getReadableDatabase();
// 2、查询所有数据
Cursor cursor = db.query("StudentMgs",null,null,null,null,null,null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
int phone = cursor.getInt(cursor.getColumnIndex("phone"));
Log.d("MainActivity", "The student name is "+name);
Log.d("MainActivity", "The student sex is "+sex);
Log.d("MainActivity", "The student age is "+age);
Log.d("MainActivity", "The student phone is "+phone);
}
// 关闭游标
cursor.close();
Toast.makeText(getApplicationContext(),"数据查询成功",Toast.LENGTH_LONG).show();
}
}
最后,感谢大家观看,小白刚学习sqlite,该文章可能有很多不足的地方,请谅解!有错误的请指出。