一.基础知识
- Android Studio 使用自带SQLite 数据库、SQLIiteOpenHelper帮助类
- SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。
- Android提供了一个SQLiteOpenHelper帮助类,用于对数据库进行创建和升级
- SQLiteOpenHelper是一个抽象类,使用时需要创建自己的类去继承它。
- SQLiteOpenHelper有两个抽象方法onCreate()和onUpgrade(),必须在自己的类中重写这两个方法,然后分别在这两个方法中实现创建和升级数据库的逻辑。
二.用实训案例来了解
1.创建安卓项目
2.创建MyDatabaseHelper继承数据库
- 代码提示
package net.yuanjing.database_test;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREAT_Student = "create table Student ("
+"id integer primary key autoincrement,"
+"name text,"
+"number text)";
private Context mContext;
public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREAT_Student);
Toast.makeText(mContext,"Creat succeeded",Toast.LENGTH_LONG);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
3.主布局资源文件中建立一个按钮,点击按钮就会新建数据库
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/creat_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Creat database"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
4.主界面类MainActivity.java
package net.yuanjing.database_test;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
//新建MyDatabaseHelper的对象
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
//通过构造函数里面的参数调用它,私有的构造方法,name及时数据库的名字,factory是工厂的,这个不用管直接写null就行了,version是版本信息
dbHelper = new MyDatabaseHelper(this, "StudentStore.db", null, 1);
//获取按钮
Button creatDatabase = (Button) findViewById(R.id.create_database);
creatDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getWritableDatabase();//可以创建或打开一个现有的数据库,如果数据库本身就存在的话,那么就会去打开它,
// 但是我们这里还没有StudentStore这个数据库那么我们调用的时候就会去新建一个StudentStore的数据库,
// 创建的同时,它会调用MyDatabaseHelper中的onCreate方法,也就会新建一个表,这里数据库和表就创建成功了
}
});
}
}
5.建立一个Button按钮,向数据库插入信息
<Button
android:id="@+id/add_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add data" />
- 在主界面里面调用方法,添加插入信息
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();//调用方法,就可以添加数据
ContentValues values = new ContentValues();
//插入第一条数据
values.put("name", "ZhangSan");
values.put("number", "123456");
db.insert("Student", null, values);//插入到Student表中,插入value的值
//将第一条数据clear一下,在插入第二条数据之前
values.clear();
//插入第二条数据
values.put("name", "XiaoMing");
values.put("number", "234561");
db.insert("Student", null, values);
}
});
- 查询我们的数据库,把它打印到我们的日志里面
- 用到query()方法参数
6.定义一个查询Button按钮
<Button
android:id="@+id/query_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Query data" />
- 在主界面类里调用方法
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Student",null,null,null,null,null,null);
if (cursor.moveToFirst()) {
do {
@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
@SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndex("number"));
Log.d("MainActivity", "name" + name);
Log.d("MainActivity", "number" + number);
} while (cursor.moveToNext());
}
cursor.close();
}
});
6.主界面类MainActivity.java的总代码提示
package net.yuanjing.database_test;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
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;
public class MainActivity extends AppCompatActivity {
//新建MyDatabaseHelper的对象
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
//通过构造函数里面的参数调用它,私有的构造方法,name及时数据库的名字,factory是工厂的,这个不用管直接写null就行了,version是版本信息
dbHelper = new MyDatabaseHelper(this, "StudentStore.db", null, 1);
//获取按钮
Button creatDatabase = (Button) findViewById(R.id.create_database);
creatDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getWritableDatabase();//可以创建或打开一个现有的数据库,如果数据库本身就存在的话,那么就会去打开它,
// 但是我们这里还没有StudentStore这个数据库那么我们调用的时候就会去新建一个StudentStore的数据库,
// 创建的同时,它会调用MyDatabaseHelper中的onCreate方法,也就会新建一个表,这里数据库和表就创建成功了
}
});
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();//调用方法,就可以添加数据
ContentValues values = new ContentValues();
//插入第一条数据
values.put("name", "ZhangSan");
values.put("number", "123456");
db.insert("Student", null, values);//插入到Student表中,插入value的值
//将第一条数据clear一下,在插入第二条数据之前
values.clear();
//插入第二条数据
values.put("name", "XiaoMing");
values.put("number", "234561");
db.insert("Student", null, values);
}
});
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("Student",null,null,null,null,null,null);
if (cursor.moveToFirst()) {
do {
@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex("name"));
@SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndex("number"));
Log.d("MainActivity", "name" + name);
Log.d("MainActivity", "number" + number);
} while (cursor.moveToNext());
}
cursor.close();
}
});
}
}
7.布局资源文件的总代码提示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/create_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Create database" />
<Button
android:id="@+id/add_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add data" />
<Button
android:id="@+id/query_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Query data" />
</LinearLayout>