Android编程之数据库的创建方法详解

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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • SpringBoot自动配置原理详解

    Spring Boot是一个非常流行的Java框架,它可以帮助开发人员快速构建基于Spring的应用程序。其中一个最重要的特性是自动配置,它可以根据应用程序的依赖关系和配置文件来自动配置应用程序。在本文中,我们将详细讲解Spring Boot自动配置的原理,并提供两个示例来演示如何使用自动配置。 Spring Boot自动配置原理 Spring Boot的自…

    Java 2023年5月15日
    00
  • 在Java中使用基本的正则表达式

    下面就详细讲解“在Java中使用基本的正则表达式”的完整攻略。正则表达式是一种强大的文本匹配工具,可以用来搜索、置换和提取字符串中的特定字符或模式。Java可以使用基本的正则表达式实现这些功能。 1. 正则表达式的语法 正则表达式由普通字符(例如字母、数字等)和特殊字符组成。特殊字符通常由反斜线转义。以下是一些重要的特殊字符: 单个字符 .:匹配任何字符(除…

    Java 2023年5月27日
    00
  • SpringSecurity+Redis认证过程小结

    下面是完整的SpringSecurity+Redis认证过程攻略。 准备工作 要进行SpringSecurity+Redis认证,我们需要先进行一些准备工作。具体包括: 搭建好Spring项目,并引入相应的依赖库,如SpringSecurity和Redis。 配置好SpringSecurity,包括配置安全过滤器、权限控制等内容。 安装配置好Redis,确保…

    Java 2023年5月20日
    00
  • JavaScript中${pageContext.request.contextPath}取值问题及解决方案

    “JavaScript中${pageContext.request.contextPath}取值问题及解决方案”的完整攻略如下: 问题说明 在JSP页面中,如果要在JavaScript代码中获取当前web应用的上下文路径,一种常见的写法是${pageContext.request.contextPath}。例如,下面的代码展示了在JSP页面中如何使用该变量:…

    Java 2023年6月15日
    00
  • Android应用开发之将SQLite和APK一起打包的方法

    Android应用开发中采用SQLite存储数据是非常常见的做法,而将SQLite数据库文件和APK文件打包在一起发布则可以方便用户下载和安装。下面将详细介绍将SQLite和APK打包在一起的方法。 准备工作 首先,需要将SQLite数据库文件放在app/src/main/assets文件夹下。如果该文件夹不存在,则手动创建该文件夹。 在代码中访问SQLit…

    Java 2023年5月20日
    00
  • jsp实现登录界面

    那么我们首先了解一下jsp实现登录界面的步骤: 创建一个jsp文件用于展示登录界面,包含用户名和密码输入框、登录按钮等组件。 编写一个servlet用于处理用户提交的登录表单数据,校验用户名和密码是否正确。 如果验证通过,将用户信息保存到会话中,然后跳转到登录成功的页面。 如果验证不通过,返回登录界面,并在界面上展示错误提示信息。 下面是一个示例: 创建一个…

    Java 2023年6月15日
    00
  • Java常用工具类—集合排序

    下面是Java常用工具类—集合排序的完整攻略: 一、集合排序的介绍 集合是Java中非常重要的一种数据结构,它可以存储多个相同类型的对象。集合中的元素是没有固定顺序的,而如果我们需要按照一定的规则对集合中的元素进行排序,那么就需要使用集合排序的功能。 集合排序可以对一个集合中的元素按照升序或降序进行排序。Java中提供了很多集合排序的方式,如排序工具类、实现…

    Java 2023年5月26日
    00
  • Java之jdbc连接mysql数据库的方法步骤详解

    下面是Java连接MySQL数据库的步骤详解: 步骤1:加载MySQL JDBC驱动 在Java程序中使用JDBC连接MySQL数据库之前,必须先加载MySQL的JDBC驱动。MySQL提供了两种驱动:JDBC驱动和JDBC4.0及以上的驱动。我们使用JDBC驱动来连接。 Class.forName("com.mysql.jdbc.Driver&q…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部