目录
SQLite
SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置和管理一个单独的服务。这也使得 SQLite 是一种非常轻量级的数据库解决方案,非常适合小型项目、嵌入式数据库或者测试环境中
SQLite 的一些主要特性包括:
无服务器的:SQLite 不是一个单独的服务进程,而是直接嵌入到应用程序中。它直接读取和写入磁盘文件
事务性的:SQLite 支持 ACID(原子性、一致性、隔离性、持久性)属性,能够确保所有事务都是安全、一致的,即使在系统崩溃或者电力中断的情况下
零配置的:SQLite 不需要任何配置或者管理,这使得它非常容易安装和使用
自包含的:SQLite 是一个自包含系统,这意味着它几乎不依赖其他任何外部系统或者库,这使得 SQLite 的跨平台移植非常方便
小型的:SQLite 非常小巧轻量,全功能的 SQLite 数据库引擎的大小只有几百KB
广泛应用:SQLite 被广泛应用在各种各样的产品和系统中,包括手机、平板电脑、嵌入式系统、物联网设备等。它也被广泛用于网站开发、科学研究、数据分析等领域
在一些轻量级的应用场景下,SQLite 是一个非常理想的选择,因为它简单、高效、易于使用和部署。然而,对于需要处理大量并发写操作或者需要更高级的功能(如用户管理或者存储过程等)的应用场景,更全功能的数据库系统(如 PostgreSQL 或 MySQL)可能会是更好的选择
当然了,这里只是见到那的提一下关于SQLite的内容,想深入了解可以自行查阅资料
实验目的
1、 掌握如何在 Android 开发中使用 SQLite 数据库
2、 熟悉设计数据库表结构的方法与步骤
3、 理解 contentprovider 的使用方法及流程,理解 ContentProvider、
Resolver、Uri、Urimatcher 等的原理。
实验内容
1、实现 contentprovider 和 contentresolver 通过 uri 的调用;
2、实现 contentprovider 对数据库 sqlite 的功能:增、删、改、查;
3、数据库的表结构自行设计;
实验要求
1、配置 SQLite 数据库的运行环境
2、熟悉 contentprovider 对数据库 sqlite 增、删、改、查的具体操作和流程
3、充分理解 SQLite 数据库的使用原理和方式
项目结构
代码实现
ContentProvider
java
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class ContentProvider extends android.content.ContentProvider {
private Context mContext;
DBHelper mDbHelper = null;
SQLiteDatabase db = null;
@Override
public boolean onCreate() {
mContext = getContext();
mDbHelper = new DBHelper(getContext());
db = mDbHelper.getWritableDatabase();
db.execSQL("delete from user");
db.execSQL("insert into user values(1,'丁真');");
db.execSQL("insert into user values(2,'孙笑川');");
return true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
String table = DBHelper.USER_TABLE_NAME;
db.insert(table, null, values);
mContext.getContentResolver().notifyChange(uri, null);
return uri;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
{
String table = DBHelper.USER_TABLE_NAME;
return db.query(table, projection, selection, selectionArgs, null, null, sortOrder, null);
}
@Override
public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
String table = DBHelper.USER_TABLE_NAME;
return db.update(table, values, selection, selectionArgs);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String table = DBHelper.USER_TABLE_NAME;
return db.delete(table, selection, selectionArgs);
}
@Override
public String getType(Uri uri) {
return null;
}
}
DBHelper
java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "Student";
// 表名
public static final String USER_TABLE_NAME = "user";
private static final int DATABASE_VERSION = 1;
//数据库版本号
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " name TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
myActivty
java
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.example.exp61.R;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class myActivity extends Activity {
// 设置URI
private Uri uri = Uri.parse("content://com.example.exp61.ui.theme.ContentProvider/user");
ContentResolver resolver;
Button bt_add, bt_delete, bt_querry, bt_update;
ListView listView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myactivity);
bt_add = findViewById(R.id.b_add);
bt_delete = findViewById(R.id.b_delete);
bt_querry = findViewById(R.id.b_querry);
bt_update = findViewById(R.id.b_update);
listView = findViewById(R.id.list_view);
bt_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues values = new ContentValues();
values.put("_id",4);
values.put("name", "luyunchi");
resolver = getContentResolver();
resolver.insert(uri, values);
Toast.makeText(myActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
}
});
bt_querry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<String> data = new ArrayList<String>();
resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"_id","name"}, null, null, null);
while (cursor.moveToNext()){
data.add(cursor.getInt(0) + " " + cursor.getString(1));
}
ArrayAdapter<String> adapter=new ArrayAdapter<>(myActivity.this,android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
cursor.close();
Toast.makeText(myActivity.this, "查询完成", Toast.LENGTH_SHORT).show();
}
});
bt_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
resolver = getContentResolver();
String selection = "_id = ?";
String [] Arg = new String[]{"2"};
int rowsAffected = resolver.delete(uri, selection, Arg);
if (rowsAffected > 0) {
Toast.makeText(myActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(myActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
}
}
});
bt_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues values = new ContentValues();
values.put("_id", 10);
String selection = "_id = ?";
String [] Arg = new String[]{"1"};
resolver = getContentResolver();
int rowsAffected = resolver.update(uri, values, selection, Arg);
if (rowsAffected > 0) {
Toast.makeText(myActivity.this, "更新成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(myActivity.this, "更新失败", Toast.LENGTH_SHORT).show();
}
}
});
}
}
myactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="455dp" />
<Button
android:id="@+id/b_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:id="@+id/b_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除" />
<Button
android:id="@+id/b_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新" />
<Button
android:id="@+id/b_querry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询" />
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Exp61"
tools:targetApi="31">
<activity
android:name=".ui.theme.myActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Exp61">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name=".ui.theme.ContentProvider"
android:authorities="com.example.exp61.ui.theme.ContentProvider"
android:exported="true"/>
</application>
</manifest>
结果展示
以上。