Android SQLite CRUD示例教程

Android SQLite Database Example Tutorial - JournalDevAndroid SQLite Example Tutorial. Android Database Tutorial. Android SQLite Database Tutorial, SQLite query, insert, SQLiteDatabase, put, delete, crudhttps://www.journaldev.com/9438/android-sqlite-database-example-tutorial

欢迎来到安卓 SQLite 示例教程。Android SQLite是Android应用程序存储数据的首选方式。对于许多应用程序,SQLite是应用程序的主干,无论是直接使用还是通过某些第三方包装器使用。以下是我们今天将使用Android SQLite数据库创建的最终应用程序。

Android SQLite

Android SQLite是一个非常轻量级的数据库,Android操作系统自带,Android SQLite结合了干净的SQL接口,非常小的内存占用和不错的速度。对于Android,SQLite被"融入"Android运行时,因此每个Android应用程序都可以创建自己的SQLite数据库。

Android SQLite原生API不是JDBC,因为JDBC对于内存有限的智能手机来说可能有太多的开销。成功创建数据库后,它位于/data/data/com.journaldev.sqlite/databases/目录下,可从Android设备监视器访问。

SQLite是一个典型的关系数据库,包含表(由行和列组成),索引等。我们可以创建自己的表来相应地保存数据。此结构称为架构

Android SQLite SQLiteOpenHelper

Android具有可用于处理不断变化的数据库架构的功能,这些功能主要取决于使用SQLiteOpenHelper类。

SQLiteOpenHelper旨在摆脱两个非常常见的问题。

  1. 当应用程序首次运行时 – 此时,我们还没有数据库。因此,我们将不得不创建表、索引、起始数据等。
  2. 当应用程序升级到较新的架构时 – 我们的数据库仍将位于旧版应用程序的旧架构上。我们可以选择更改数据库架构,以满足应用其余部分的需求。

SQLiteOpenHelper总结这些逻辑,以根据我们的规范创建和升级数据库。为此,我们需要创建一个自定义SQLiteOpenHelper子类,以实现至少以下三个方法。

  1. 构造函数:它采用上下文(例如,活动),数据库的名称,可选的游标工厂(我们将在后面讨论这一点)以及表示您正在使用的数据库模式版本的整数(通常从1开始,稍后递增)。
    
    public DatabaseHelper(Context context) {
            super(context, DB_NAME, null, DB_VERSION);
        }
    
  2. onCreate(SQLiteDatabase db):当没有数据库并且应用程序需要一个数据库时,会调用它。它向我们传递一个SQLiteDatabase对象,指向新创建的数据库,我们可以用表和初始数据填充该对象。
  3. onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion):当我们需要的模式版本与数据库的模式版本不匹配时,它会调用它,它会向我们传递一个SQLiteDatabase对象以及旧的和新的版本号。因此,我们可以找出将数据库从旧架构转换为新架构的最佳方法。

我们定义一个DBManager类来执行所有数据库 CRUD(创建、读取、更新和删除)操作。

打开和关闭 Android SQLite 数据库连接

在执行任何数据库操作(如插入、更新、删除表中的记录)之前,请先通过调用getWritableDatabase()方法打开数据库连接,如下所示:


public DBManager open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

dbHelperSQLiteOpenHelper的子类的实例。

要关闭数据库连接,将调用以下方法。


 public void close() {
        dbHelper.close();
    }

将新记录插入到 Android SQLite 数据库表中

以下代码片段显示了如何在 android SQLite 数据库中插入新记录。


public void insert(String name, String desc) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(DatabaseHelper.SUBJECT, name);
        contentValue.put(DatabaseHelper.DESC, desc);
        database.insert(DatabaseHelper.TABLE_NAME, null, contentValue);
    }

内容值使用给定的初始大小创建一组空值。当我们跳转到编码部分时,我们将讨论其他实例值。

更新安卓 SQLite 数据库表中的记录

以下代码段演示如何更新单个记录。


public int update(long _id, String name, String desc) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.SUBJECT, name);
        contentValues.put(DatabaseHelper.DESC, desc);
        int i = database.update(DatabaseHelper.TABLE_NAME, contentValues, DatabaseHelper._ID + " = " + _id, null);
        return i;
    }

Android SQLite – 删除记录

我们只需要传递要删除的记录的ID,如下所示。


public void delete(long _id) {
        database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper._ID + "=" + _id, null);
    }

Android SQLite Cursor

游标表示查询的整个结果集。获取查询后,将调用cursor.moveToFirst()。调用 moveToFirst() 可以执行两项操作:

  • 它允许我们测试查询是否返回空集(通过测试返回值)
  • 它将光标移动到第一个结果(当集合不为空时)

以下代码用于提取所有记录:


 public Cursor fetch() {
        String[] columns = new String[] { DatabaseHelper._ID, DatabaseHelper.SUBJECT, DatabaseHelper.DESC };
        Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, columns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

使用游标的另一种方法是将其包装在CursorAdapter .就像ArrayAdapter调整数组一样,CursorAdapter调整 Cursor 对象,使其数据可用于​​​AdapterView,就像ListView .

让我们跳转到使用 SQLite 存储一些有意义数据的项目。

Android SQLite 示例项目结构

android sqlite example tutorial project

在此应用程序中,我们希望创建以ListView的形式存储国家/地区名称及其各自货币的记录。我们涵盖了上面讨论的所有功能。

Android SQLite Project Code

该应用程序由5个类组成。我们从定义DatabaseHelper开始,它是SQLiteOpenHelper的子类,如下所示:

DatabaseHelper.java


package com.journaldev.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

    // Table Name
    public static final String TABLE_NAME = "COUNTRIES";

    // Table columns
    public static final String _ID = "_id";
    public static final String SUBJECT = "subject";
    public static final String DESC = "description";

    // Database Information
    static final String DB_NAME = "JOURNALDEV_COUNTRIES.DB";

    // database version
    static final int DB_VERSION = 1;

    // Creating table query
    private static final String CREATE_TABLE = "create table " + TABLE_NAME + "(" + _ID
            + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT + " TEXT NOT NULL, " + DESC + " TEXT);";

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

如上所述,我们已经覆盖了构造函数以外的onCreate()和onUpgrade() 方法。我们已将名称分配给数据库和表,作为JOURNALDEV_COUNTRIES。DB和国家/地区分别。每当插入新行时,索引列都会自动递增。国家/地区和货币的列名称为"主题"和"说明"。

DBManager 类是初始化 DatabaseHelper 并定义 CRUD 操作的位置。下面是此类的代码:

DBManager.java


package com.journaldev.sqlite;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {

    private DatabaseHelper dbHelper;

    private Context context;

    private SQLiteDatabase database;

    public DBManager(Context c) {
        context = c;
    }

    public DBManager open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        dbHelper.close();
    }

    public void insert(String name, String desc) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(DatabaseHelper.SUBJECT, name);
        contentValue.put(DatabaseHelper.DESC, desc);
        database.insert(DatabaseHelper.TABLE_NAME, null, contentValue);
    }

    public Cursor fetch() {
        String[] columns = new String[] { DatabaseHelper._ID, DatabaseHelper.SUBJECT, DatabaseHelper.DESC };
        Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, columns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

    public int update(long _id, String name, String desc) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.SUBJECT, name);
        contentValues.put(DatabaseHelper.DESC, desc);
        int i = database.update(DatabaseHelper.TABLE_NAME, contentValues, DatabaseHelper._ID + " = " + _id, null);
        return i;
    }

    public void delete(long _id) {
        database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper._ID + "=" + _id, null);
    }

}

CountryListActivity.java类是在应用程序启动时启动的活动。下面是为其定义的布局:

fragment_emp_list.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:dividerHeight="1dp"
        android:padding="10dp" >
    </ListView>

    <TextView
        android:id="@+id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/empty_list_text" />

</RelativeLayout>

此处定义了一个 ListView 组件,以包括存储在数据库中的记录。最初,ListView 将为空,因此 TextView 用于显示相同的内容。

CountryListActivity.java


package com.journaldev.sqlite;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

public class CountryListActivity extends ActionBarActivity {

    private DBManager dbManager;

    private ListView listView;

    private SimpleCursorAdapter adapter;

    final String[] from = new String[] { DatabaseHelper._ID,
            DatabaseHelper.SUBJECT, DatabaseHelper.DESC };

    final int[] to = new int[] { R.id.id, R.id.title, R.id.desc };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_emp_list);

        dbManager = new DBManager(this);
        dbManager.open();
        Cursor cursor = dbManager.fetch();

        listView = (ListView) findViewById(R.id.list_view);
        listView.setEmptyView(findViewById(R.id.empty));

        adapter = new SimpleCursorAdapter(this, R.layout.activity_view_record, cursor, from, to, 0);
        adapter.notifyDataSetChanged();

        listView.setAdapter(adapter);

        // OnCLickListiner For List Items
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long viewId) {
                TextView idTextView = (TextView) view.findViewById(R.id.id);
                TextView titleTextView = (TextView) view.findViewById(R.id.title);
                TextView descTextView = (TextView) view.findViewById(R.id.desc);

                String id = idTextView.getText().toString();
                String title = titleTextView.getText().toString();
                String desc = descTextView.getText().toString();

                Intent modify_intent = new Intent(getApplicationContext(), ModifyCountryActivity.class);
                modify_intent.putExtra("title", title);
                modify_intent.putExtra("desc", desc);
                modify_intent.putExtra("id", id);

                startActivity(modify_intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.add_record) {

            Intent add_mem = new Intent(this, AddCountryActivity.class);
            startActivity(add_mem);

        }
        return super.onOptionsItemSelected(item);
    }

}

在此活动中,将调用 DBManager 对象来执行 CRUD 操作。

定义 SimpleCursorAdapter 是为了将 Cursor 对象中返回的查询结果中的元素添加到列表中。
在列表项上,单击一个意向以打开 ModifyCountryActivity 类。

该菜单包含用于从操作栏添加新记录的项。在这里,再次执行一个意向以打开 AddCountryActivity 类。下面是menu.xml代码。

menu.xml


<menu xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    tools:context="com.example.sqlitesample.MainActivity" >

    <item
        android:id="@+id/add_record"
        android:icon="@android:drawable/ic_menu_add"
        android:orderInCategory="100"
        android:title="@string/add_record"
        app:showAsAction="always"/>

</menu>

AddCountryActivity.java文件的 xml 布局和代码定义如下:

activity_add_record.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp" >

    <EditText
        android:id="@+id/subject_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_title" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/description_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_desc"
        android:inputType="textMultiLine"
        android:minLines="5" >
    </EditText>

    <Button
        android:id="@+id/add_record"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/add_record" />

</LinearLayout>

定义了两个 EditText 组件,这些组件采用国家/地区和货币的输入,以及一个用于将值添加到数据库并将其显示在 ListView 中的按钮。

AddCountryActivity.java


package com.journaldev.sqlite;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class AddCountryActivity extends Activity implements OnClickListener {

    private Button addTodoBtn;
    private EditText subjectEditText;
    private EditText descEditText;

    private DBManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setTitle("Add Record");

        setContentView(R.layout.activity_add_record);

        subjectEditText = (EditText) findViewById(R.id.subject_edittext);
        descEditText = (EditText) findViewById(R.id.description_edittext);

        addTodoBtn = (Button) findViewById(R.id.add_record);

        dbManager = new DBManager(this);
        dbManager.open();
        addTodoBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add_record:

                final String name = subjectEditText.getText().toString();
                final String desc = descEditText.getText().toString();

                dbManager.insert(name, desc);

                Intent main = new Intent(AddCountryActivity.this, CountryListActivity.class)
                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                startActivity(main);
                break;
        }
    }

}

此处执行的 CRUD 操作是向数据库中添加新记录。

ModifyCountryActivity.java 文件的 xml 布局和代码定义如下:

activity_modify_record.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <EditText
        android:id="@+id/subject_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:ems="10"
        android:hint="@string/enter_title" />

    <EditText
        android:id="@+id/description_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_desc"
        android:inputType="textMultiLine"
        android:minLines="5" >
    </EditText>


    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:weightSum="2"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_update"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/btn_update" />

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/btn_delete" />
    </LinearLayout>

</LinearLayout>

它与以前的布局类似,只是添加了修改和删除按钮。

ModifyCountryActivity.java


package com.journaldev.sqlite;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class ModifyCountryActivity extends Activity implements OnClickListener {

    private EditText titleText;
    private Button updateBtn, deleteBtn;
    private EditText descText;

    private long _id;

    private DBManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setTitle("Modify Record");

        setContentView(R.layout.activity_modify_record);

        dbManager = new DBManager(this);
        dbManager.open();

        titleText = (EditText) findViewById(R.id.subject_edittext);
        descText = (EditText) findViewById(R.id.description_edittext);

        updateBtn = (Button) findViewById(R.id.btn_update);
        deleteBtn = (Button) findViewById(R.id.btn_delete);

        Intent intent = getIntent();
        String id = intent.getStringExtra("id");
        String name = intent.getStringExtra("title");
        String desc = intent.getStringExtra("desc");

        _id = Long.parseLong(id);

        titleText.setText(name);
        descText.setText(desc);

        updateBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_update:
                String title = titleText.getText().toString();
                String desc = descText.getText().toString();

                dbManager.update(_id, title, desc);
                this.returnHome();
                break;

            case R.id.btn_delete:
                dbManager.delete(_id);
                this.returnHome();
                break;
        }
    }

    public void returnHome() {
        Intent home_intent = new Intent(getApplicationContext(), CountryListActivity.class)
                .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(home_intent);
    }
}

此处执行的 CRUD 操作是更新和删除记录。

下图是我们项目最终输出的屏幕截图。

第一个图像是首次启动应用程序时看到的输出。

android sqlite

第二个图像是单击操作栏中的菜单选项以添加新记录的结果,如下所示。

android sqlite example create

第三张图片显示了添加3条记录时的输出

android sqlite example crud

第四张图片显示了单击任何列表项修改或删除记录时的输出

android sqlite example update

最终图像是删除记录时的输出。在这个例子中,我们删除了第一条
记录

android sqlite example delete

打开安卓 SQLite 数据库文件

正如我们在本教程前面所讨论的,数据库文件存储在可从 Android 设备监视器访问的内部存储中,如下图所示。

android sqlite adm

要查看此数据库,我们需要将此文件从设备拉到桌面。这是通过单击右上角的菜单选项来完成的,如下图所示

android sqlite pull file from device

要打开此文件,请从链接下载SQLiteBrowser。

下面的代码段显示了浏览器中的架构和表。

android sqlite database sqlitebrowser

要查看表格,请转到顶部的浏览数据选项卡。下图可见:

android sqlite database table

这结束了Android SQLite教程。最终的Android SQLite项目可以从下面的链接下载。

参考:
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值