Android编程之数据库的创建方法详解
一、数据库基础知识
1. 什么是数据库?
数据库(Database),是指在一定组织结构下,存储在一起的、可共享的大量数据的集合。通俗地说,就是把大量数据以某种方式结构化存储下来,方便我们进行数据的存取、管理、处理等操作。
2. 为什么要使用数据库?
数据库的优点主要有以下几点:
- 数据库可以方便地存储和管理大量的数据;
- 数据库可以实现数据的共享和共同使用;
- 数据库可以为数据提供高效的检索、排序、过滤和统计等功能;
- 数据库可以确保数据的安全性和完整性。
3. 常见的数据库类型
目前常用的关系型数据库有 MySQL、Oracle、SQLite、SQLServer 等。其中,SQLite 是一种轻量级的关系型数据库,是移动端开发中最常用的数据库类型之一。在 Android 中也内置了 SQLite 数据库。
二、SQLite 数据库的创建和使用
下面,我们以 Android Studio 为例,演示如何创建和使用 SQLite 数据库。
1. 创建数据库和数据表
在 Android 中,我们可以通过 SQLiteOpenHelper 类来创建和管理 SQLite 数据库。SQLiteOpenHelper 是 Android 提供的一个抽象类,在使用时需要我们继承该类,并实现其抽象方法。
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "my_db"; // 数据库名称
private static final int DATABASE_VERSION = 1; // 数据库版本号
public static final String TABLE_NAME = "user"; // 数据表名称
public static final String COLUMN_ID = "id"; // id 列
public static final String COLUMN_NAME = "name"; // name 列
public static final String COLUMN_AGE = "age"; // age 列
private static final String SQL_CREATE_TABLE =
"create table " + TABLE_NAME + " ( " +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_NAME + " text, " +
COLUMN_AGE + " integer)";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_TABLE); // 创建数据表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + TABLE_NAME); // 删除数据表
onCreate(db); // 重新创建数据表
}
}
上面的代码演示了如何创建一个名为 my_db 的数据库,并在其中创建一个名为 user 的数据表,该表包含 id、name、age 三个列。
2. 插入数据
创建完数据库和数据表之后,我们需要往数据表中插入一些数据。下面的代码演示了如何往 user 表中插入一条数据:
MyDatabaseHelper db_helper = new MyDatabaseHelper(this);
SQLiteDatabase db = db_helper.getWritableDatabase(); // 获取可写的数据库实例
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.COLUMN_NAME, "张三");
values.put(MyDatabaseHelper.COLUMN_AGE, 20);
long id = db.insert(MyDatabaseHelper.TABLE_NAME, null, values); // 插入数据
db.close(); // 关闭数据库
3. 查询数据
插入数据之后,我们需要查询数据,下面的代码演示了如何查询 user 表中的所有数据:
MyDatabaseHelper db_helper = new MyDatabaseHelper(this);
SQLiteDatabase db = db_helper.getReadableDatabase(); // 获取只读的数据库实例
Cursor cursor = db.query(MyDatabaseHelper.TABLE_NAME, null, null, null, null, null, null);
// 查询数据
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_NAME));
int age = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_AGE));
Log.d("test", "id=" + id + ", name=" + name + ", age=" + age);
} while (cursor.moveToNext());
}
cursor.close(); // 关闭游标
db.close(); // 关闭数据库
三、示例代码
下面给出两个使用 SQLite 数据库的示例:
示例一:创建一个简单的便签应用
这个示例是一个简单的便签应用,可以让用户创建、编辑和删除便签。每个便签包含一个标题和一个正文。便签数据存储在 SQLite 数据库中。
关键代码:
public class NoteDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "note.db";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "note";
public static final String COLUMN_ID = "id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_CONTENT = "content";
private static final String SQL_CREATE_TABLE =
"create table " + TABLE_NAME + " ( " +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_TITLE + " text, " +
COLUMN_CONTENT + " text)";
public NoteDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + TABLE_NAME);
onCreate(db);
}
}
public class NoteActivity extends AppCompatActivity {
private NoteDatabaseHelper mDbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note);
mDbHelper = new NoteDatabaseHelper(this);
// 点击“保存”按钮时,将当前便签数据保存到数据库中
Button btnSave = (Button) findViewById(R.id.btn_save);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
String title = ((EditText) findViewById(R.id.et_title)).getText().toString();
String content = ((EditText) findViewById(R.id.et_content)).getText().toString();
ContentValues values = new ContentValues();
values.put(NoteDatabaseHelper.COLUMN_TITLE, title);
values.put(NoteDatabaseHelper.COLUMN_CONTENT, content);
if (getIntent().hasExtra("note_id")) { // 如果是编辑模式
int noteId = getIntent().getIntExtra("note_id", -1);
db.update(NoteDatabaseHelper.TABLE_NAME, values,
NoteDatabaseHelper.COLUMN_ID + "=" + noteId, null);
} else { // 如果是新建模式
db.insert(NoteDatabaseHelper.TABLE_NAME, null, values);
}
db.close();
setResult(RESULT_OK);
finish();
}
});
// 如果是编辑模式,将当前便签数据显示在界面中
if (getIntent().hasExtra("note_id")) {
int noteId = getIntent().getIntExtra("note_id", -1);
SQLiteDatabase db = mDbHelper.getReadableDatabase();
Cursor cursor = db.query(NoteDatabaseHelper.TABLE_NAME, null,
NoteDatabaseHelper.COLUMN_ID + "=" + noteId,
null, null, null, null);
if (cursor.moveToFirst()) {
String title = cursor.getString(cursor.getColumnIndex(NoteDatabaseHelper.COLUMN_TITLE));
String content = cursor.getString(cursor.getColumnIndex(NoteDatabaseHelper.COLUMN_CONTENT));
EditText etTitle = (EditText) findViewById(R.id.et_title);
EditText etContent = (EditText) findViewById(R.id.et_content);
etTitle.setText(title);
etContent.setText(content);
}
cursor.close();
db.close();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mDbHelper.close();
}
}
示例二:创建一个简单的备忘录应用
这个示例是一个简单的备忘录应用,可以让用户创建、编辑和删除备忘录。每个备忘录包含一个标题、正文和一个时间戳。备忘录数据存储在 SQLite 数据库中。
关键代码:
public class MemoDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "memo.db";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "memo";
public static final String COLUMN_ID = "id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_CONTENT = "content";
public static final String COLUMN_TIMESTAMP = "timestamp";
private static final String SQL_CREATE_TABLE =
"create table " + TABLE_NAME + " ( " +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_TITLE + " text, " +
COLUMN_CONTENT + " text, " +
COLUMN_TIMESTAMP + " integer)";
public MemoDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + TABLE_NAME);
onCreate(db);
}
}
public class MemoActivity extends AppCompatActivity {
private MemoDatabaseHelper mDbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memo);
mDbHelper = new MemoDatabaseHelper(this);
// 点击“保存”按钮时,将当前备忘录数据保存到数据库中
Button btnSave = (Button) findViewById(R.id.btn_save);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
String title = ((EditText) findViewById(R.id.et_title)).getText().toString();
String content = ((EditText) findViewById(R.id.et_content)).getText().toString();
long timestamp = System.currentTimeMillis();
ContentValues values = new ContentValues();
values.put(MemoDatabaseHelper.COLUMN_TITLE, title);
values.put(MemoDatabaseHelper.COLUMN_CONTENT, content);
values.put(MemoDatabaseHelper.COLUMN_TIMESTAMP, timestamp);
if (getIntent().hasExtra("memo_id")) { // 如果是编辑模式
int memoId = getIntent().getIntExtra("memo_id", -1);
db.update(MemoDatabaseHelper.TABLE_NAME, values,
MemoDatabaseHelper.COLUMN_ID + "=" + memoId, null);
} else { // 如果是新建模式
db.insert(MemoDatabaseHelper.TABLE_NAME, null, values);
}
db.close();
setResult(RESULT_OK);
finish();
}
});
// 显示所有备忘录列表
ListView listView = (ListView) findViewById(R.id.list_view_memo);
SQLiteDatabase db = mDbHelper.getReadableDatabase();
Cursor cursor = db.query(MemoDatabaseHelper.TABLE_NAME, null, null, null,
null, null, MemoDatabaseHelper.COLUMN_TIMESTAMP + " desc"); // 按时间戳排序
MemoCursorAdapter adapter = new MemoCursorAdapter(this, cursor);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MemoActivity.this, MemoActivity.class);
intent.putExtra("memo_id", (int) id); // 传递备忘录的 id
startActivityForResult(intent, 1);
}
});
cursor.close();
db.close();
}
@Override
protected void onDestroy() {
super.onDestroy();
mDbHelper.close();
}
}
public class MemoCursorAdapter extends CursorAdapter {
public MemoCursorAdapter(Context context, Cursor cursor) {
super(context, cursor);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.item_memo, parent, false);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
TextView tvContent = (TextView) view.findViewById(R.id.tv_content);
TextView tvTimestamp = (TextView) view.findViewById(R.id.tv_timestamp);
String title = cursor.getString(cursor.getColumnIndex(MemoDatabaseHelper.COLUMN_TITLE));
String content = cursor.getString(cursor.getColumnIndex(MemoDatabaseHelper.COLUMN_CONTENT));
long timestamp = cursor.getLong(cursor.getColumnIndex(MemoDatabaseHelper.COLUMN_TIMESTAMP));
tvTitle.setText(title);
tvContent.setText(content);
tvTimestamp.setText(TimeUtils.formatTime(timestamp));
}
}
四、总结
本文介绍了 SQLite 数据库的创建和使用方法,包括创建数据库和数据表、插入数据、查询数据等操作。同时,还给出了两个使用 SQLite 数据库的示例,分别是创建一个简单的便签应用和创建一个简单的备忘录应用。.SQLite 数据库是 Android 开发中非常重要的一部分,掌握 SQLite 数据库的使用方法对于提高 Android 应用的开发效率和质量具有重要意义。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android编程之数据库的创建方法详解 - Python技术站