当前位置:首页 > 安卓源码 > 技术博客 >

使用Android上的SQLite数据库对数据执行CRUD,即创建,读取,更新和删除

时间:2018-12-15 12:03 来源:互联网 作者:源码搜藏 浏览: 收藏 挑错 推荐 打印

介绍 每个应用都涉及数据。 大多数数据由用户通过各种输入控件提供,例如文本字段,复选框,单选按钮组,微调器和按钮。 虽然某些数据是暂时的,但即使在应用程序停止运行后,大多数数据仍需要保留或保留。 Android提供了许多用于在本地存储持久数据的巧妙技

介绍

每个应用都涉及数据。大多数数据由用户通过各种输入控件提供,例如文本字段,复选框,单选按钮组,微调器和按钮。虽然某些数据是暂时的,但即使在应用程序停止运行后,大多数数据仍需要保留或保留。Android提供了许多用于在本地存储持久数据的巧妙技术。在本文中,您将学习使用Android 上的SQLite数据库对数据执行CRUD,即创建读取更新删除 

设置舞台

在您最喜欢的Android IDE上,启动一个新的Android应用程序项目。我们给它一个应用程序名称  “AndroidSQLite”和一个域名“peterleowblog.com”。生成的项目包名称为“ com.peterleowblog.androidsqlite ”。

在项目中,创建一个名为“MainActivity”的Android活动如图1所示,此“MainActivity” 的用户界面(UI)  包含以下控件:

  • 电子邮件输入的一个  “EditText”文本字段。
  • 一个“RadioGroup”控件,带有两个“RadioButtons”用于性别选择。
  • 三个“CheckBox”控件用于爱好选择。
  • 一个“旋转”控件用于生肖选择。
  • 三个  “按钮”控件 - 分别用于保存,检索和更新数据。

用户可以键入并将新信息保存到SQLite数据库。随后,用户可以使用电子邮件作为关键字检索信息,编辑信息并将其更新到SQLite数据库中或从SQLite数据库中删除。

使用Android上的SQLite数据库对数据执行CRUD,即创建,读取,更新和删除

图1:MainActivity

准备资源

您将需要“strings.xml”中的以下字符串资源

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SQLite on Android</string>
    <string name="email">Email</string>
    <string name="gender">Gender</string>
    <string name="female">Female</string>
    <string name="male">Male</string>
    <string name="hobbies">Hobbies</string>
    <string name="coding">Coding</string>
    <string name="writing">Writing</string>
    <string name="jogging">Jogging</string>
    <string name="zodiac">Zodiac</string>
    <string name="save">Save</string>
    <string name="retrieve">Retrieve</string>
    <string name="delete">Delete</string>

    <string-array name="zodiac">
        <item>Aries</item>
        <item>Taurus</item>
        <item>Gemini</item>
        <item>Cancer</item>
        <item>Leo</item>
        <item>Virgo</item>
        <item>Libra</item>
        <item>Scorpio</item>
        <item>Sagittarius</item>
        <item>Capricorn</item>
        <item>Aquarius</item>
        <item>Pisces</item>
    </string-array>

</resources>

渲染视图

负责呈现图1视图的XML代码包含在“ activity_main.xml ”中,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <RelativeLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:paddingLeft="16dp"

        android:paddingRight="16dp"

        android:paddingTop="16dp"

        android:paddingBottom="16dp">

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:textAppearance="?android:attr/textAppearanceLarge"

            android:text=""

            android:id="@+id/textView"

            android:layout_alignParentTop="true"

            android:layout_centerHorizontal="true" />

        <EditText

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:inputType="textEmailAddress"

            android:ems="10"

            android:id="@+id/txtEmail"

            android:layout_below="@+id/textView4"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:textAppearance="?android:attr/textAppearanceMedium"

            android:text="@string/email"

            android:id="@+id/textView4"

            android:layout_below="@+id/textView"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:textAppearance="?android:attr/textAppearanceMedium"

            android:text="@string/gender"

            android:id="@+id/textView5"

            android:layout_below="@+id/txtEmail"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <RadioGroup

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_below="@+id/textView5"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true"

            android:id="@+id/radioGroupGender">

            <RadioButton

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="@string/male"

                android:id="@+id/radMale"

                android:checked="false" />

            <RadioButton

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="@string/female"

                android:id="@+id/radFemale"

                android:checked="false" />

        </RadioGroup>

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:textAppearance="?android:attr/textAppearanceMedium"

            android:text="@string/hobbies"

            android:id="@+id/textView6"

            android:layout_below="@+id/radioGroupGender"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <CheckBox

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/coding"

            android:id="@+id/chkCoding"

            android:onClick="onCheckboxClicked"

            android:checked="false"

            android:layout_below="@+id/textView6"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <CheckBox

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/writing"

            android:id="@+id/chkWriting"

            android:onClick="onCheckboxClicked"

            android:layout_below="@+id/chkCoding"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true"

            android:checked="false" />

        <CheckBox

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/jogging"

            android:id="@+id/chkJogging"

            android:onClick="onCheckboxClicked"

            android:layout_below="@+id/chkWriting"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true"

            android:checked="false" />

        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:textAppearance="?android:attr/textAppearanceMedium"

            android:text="@string/zodiac"

            android:id="@+id/textView7"

            android:layout_below="@+id/chkJogging"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <Spinner

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:id="@+id/spinnerZodiac"

            android:layout_below="@+id/textView7"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <Button

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/save"

            android:id="@+id/btnSave"

            android:onClick="save"

            android:layout_below="@+id/spinnerZodiac"

            android:layout_alignParentLeft="true"

            android:layout_alignParentStart="true" />

        <Button

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="@string/retrieve"

            android:onClick="retrieve"

            android:id="@+id/btnRetrieve"

            android:layout_alignParentBottom="true"

            android:layout_centerHorizontal="true"

            android:layout_centerInParent="false"

            android:layout_centerVertical="false" />

        <Button

            android:text="@string/delete"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_below="@+id/spinnerZodiac"

            android:layout_alignParentRight="true"

            android:layout_alignParentEnd="true"

            android:id="@+id/btnDelete" />



    </RelativeLayout>

</ScrollView>

控制活动

最后但并非最不重要的是,用于处理UI控件及其行为的代码包含在  “MainActivity.java”中  ,如下所示:

package com.peterleowblog.androidsqlite;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener,
        AdapterView.OnItemSelectedListener{

    private String email, gender, hobbies, zodiac;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((TextView) findViewById(R.id.textView)).setText(getResources().getString(R.string.app_name));

        email = gender = hobbies = zodiac = "";

        RadioGroup radioGroupGender = (RadioGroup) findViewById(R.id.radioGroupGender);
        radioGroupGender.setOnCheckedChangeListener(this);

        Spinner spinnerZodiac = (Spinner) findViewById(R.id.spinnerZodiac);
        // Populate the spinner with data source
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.zodiac, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerZodiac.setAdapter(adapter);
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        int radioButtonId = radioGroup.getCheckedRadioButtonId();
        RadioButton radioButton = (RadioButton)radioGroup.findViewById(radioButtonId);
        gender = radioButton.getText().toString();
    }

    public void onCheckboxClicked(View view) {

        CheckBox chkJogging = (CheckBox) findViewById(R.id.chkJogging);
        CheckBox chkCoding = (CheckBox) findViewById(R.id.chkCoding);
        CheckBox chkWriting = (CheckBox) findViewById(R.id.chkWriting);

        StringBuilder sb = new StringBuilder();

        if (chkJogging.isChecked()) {
            sb.append(", " + chkJogging.getText());
        }

        if (chkCoding.isChecked()) {
            sb.append(", " + chkCoding.getText());
        }

        if (chkWriting.isChecked()) {
            sb.append(", " + chkWriting.getText());
        }

        if (sb.length() > 0) { // No toast if the string is empty
            // Remove the first comma
            hobbies = sb.deleteCharAt(sb.indexOf(",")).toString();
        } else {
            hobbies = "";
        }
    }

    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        zodiac = parent.getItemAtPosition(position).toString();
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // An interface callback
    }

    public void save(View view) {

        // Add code to insert/update data into SQLite
    }

    public void retrieve(View view) {

        // Add code to retrieve data from SQLite

        setupUI(); // A method to set the data on the UI controls
    }

    public void delete(View view) {

        // Add code to delete data from SQLite

        setupUI(); // A method to set the data on the UI controls
    }

    protected void setupUI(){
        ((EditText)findViewById(R.id.txtEmail)).setText(email);

        RadioButton radMale = (RadioButton)findViewById(R.id.radMale);
        RadioButton radFemale = (RadioButton)findViewById(R.id.radFemale);

        if (gender.equals("Male")){
            radMale.setChecked(true);
        } else if (gender.equals("Female")){
            radFemale.setChecked(true);
        } else {
            radMale.setChecked(false);
            radFemale.setChecked(false);
        }

        CheckBox chkCoding = (CheckBox)findViewById(R.id.chkCoding);
        CheckBox chkWriting = (CheckBox)findViewById(R.id.chkWriting);
        CheckBox chkJogging = (CheckBox)findViewById(R.id.chkJogging);

        chkCoding.setChecked(false);
        chkWriting.setChecked(false);
        chkJogging.setChecked(false);

        if (hobbies.contains("Coding")) {
            chkCoding.setChecked(true);
        }

        if (hobbies.contains("Writing")) {
            chkWriting.setChecked(true);
        }

        if (hobbies.contains("Jogging")) {
            chkJogging.setChecked(true);
        }

        Resources resource = getResources();
        String[] zodiacArray = resource.getStringArray(R.array.zodiac);
        for(int i = 0; i < zodiacArray.length; i++){
            if(zodiacArray[i].equals(zodiac)){
                ((Spinner)findViewById(R.id.spinnerZodiac)).setSelection(i);
            }
        }
    }
}

您现在真的要深入研究SQLite数据库实现。我们走吧…

学习基础知识

“ SQLite ”是一个开源的事务性SQL数据库引擎,它是独立的,无服务器的,不需要配置。Android提供“ android.database.sqlite ”包,其中包含应用程序可用于创建和管理自己的专用数据库的类。

要实现SQLite数据库,建议的方法是创建“ SQLiteOpenHelper ”的子类并覆盖其onCreate()“ onUpgrade()方法。当实例化此子类时,它将打开数据库(如果存在),如果不存在则创建它,或者在必要时升级它。事务用于确保数据库始终保持一致状态。您添加方法来操作子类中的数据库。例如,下面的代码显示了一个名为“SqliteHelper”“ SQLiteOpenHelper ”的子类 

public class SqliteHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "MyDatabase";

    public static final int DATABASE_VERSION = 1;

    public SqliteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE users (email TEXT PRIMARY KEY, gender Text, hobbies Text, zodiac Text)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i2) {
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }

    // Implement methods to manipulate the database
}

让我们继续探索在Android上实现SQLite的CRUD。

写入SQLite数据库涉及插入或更新操作。跟着这些步骤:

  1. 调用“SQLiteOpenHelper”的  “ getWritableDatabase() ”方法以获取表示数据库“ SQLiteDatabase ”对象,并提供读写操作的方法。例如,
    SQLiteDatabase db = this.getWritableDatabase();
  2. 将值写入“ ContentValues ”对象中。例如,
    ContentValues contentValues = new ContentValues();
    contentValues.put("gender", gender);
    contentValues.put("hobbies", hobbies);
  3. 插入 的值作为一个新的记录,调用“ 插入()的方法“ SQLiteDatabase “对象和它传递‘ContentValues’对象作为第三个参数。第一个参数是表名。此方法将返回新插入行的行ID,如果发生错误,则返回-1。例如,
    result = db.insert("users", null, contentValues);
  4. 使用新值更新 现有记录,请调用“ SQLiteDatabase ”对象“ update() ”方法,并将“ContentValues”对象作为第二个参数传递给它第三个参数是“WHERE”子句,最后一个参数是传递给“WHERE”子句中“?”占位符的参数此方法将返回受影响的行数。例如,
    result = db.update("users", contentValues, "email=?", new String[] { email });

在SQLite数据库上执行读取操作,请按照下列步骤操作:

  1. 调用  “ getReadableDatabase() “  中的方法‘SQLiteOpenHelper’获得“ SQLiteDatabase “对象,表示该数据库,并提供了读操作的方法。例如:
    SQLiteDatabase db = this.getReadableDatabase();
  2. 调用“ SQLiteDatabase ”对象“ rawQuery() ”方法,并将SQL查询语句作为第一个参数传递给它。第二个参数是传递给SQL查询语句中“?”占位符的参数此方法将返回“ Cursor ”对象,该对象表示数据库查询返回的结果集。例如:
    String sql = "SELECT * FROM users WHERE email=?";
    Cursor cursor =  db.rawQuery(sql, new String[] { email });

删除

最后,要从SQLite数据库中删除数据,请按照下列步骤操作:

  1. 调用“SQLiteOpenHelper”的  “ getWritableDatabase() ”方法以获取表示数据库“ SQLiteDatabase ”对象。例如,
    SQLiteDatabase db = this.getWritableDatabase();
  2. 调用“ SQLiteDatabase ”对象“ delete() ”方法这种方法的第二个参数是“WHERE”子句和最后一个参数来代替的说法“?”占位符的“WHERE”子句。此方法将返回受影响的行数。例如,
    db.delete("users", "email=?", new String[] { email });

让它发生

现在是时候让您的项目具有 SQLite功能。

在您的项目中,添加一个名为“SqliteHelper”的新Java类文件,该文件扩展了项目中“SQLiteOpenHelper”类。实例化时,它将创建一个名为“MyDatabase”的数据库,其中包含一个名为“users”的表,其中包含四个字段 - 电子邮件(主键),性别,爱好和生肖。

包含三种方法来处理SQLite的CRUD操作。所述“saveUser()”如果该记录是新的(没有匹配的电子邮件被发现),或对具有匹配的电子邮件值中的现有记录的更新方法执行任一的插入操作。该  “的getUser()”方法接受一个电子邮件值作为参数和检索,此电子邮件值与一致的记录“用户”表。最后,  “deleteUser()”方法将一个电子邮件值作为参数,并删除与“users”中的此电子邮件值匹配的记录“SqliteHelper.java”的完整代码如下所示:

package com.peterleowblog.androidsqlite;

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

public class SqliteHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "MyDatabase";
    private static final int DATABASE_VERSION = 1;

    public SqliteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE users (email TEXT PRIMARY KEY, gender Text, hobbies Text, zodiac Text)";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i2) {
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }

    public boolean saveUser (String email, String gender, String hobbies, String zodiac)
    {
        Cursor cursor = getUser(email);

        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put("gender", gender);
        contentValues.put("hobbies", hobbies);
        contentValues.put("zodiac", zodiac);

        long result;
        if (cursor.getCount() == 0) { // Record does not exist
            contentValues.put("email", email);
            result = db.insert("users", null, contentValues);
        } else { // Record exists
            result = db.update("users", contentValues, "email=?", new String[] { email });
        }

        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

    public Cursor getUser(String email){

        SQLiteDatabase db = this.getReadableDatabase();

        String sql = "SELECT * FROM users WHERE email=?";

        return db.rawQuery(sql, new String[] { email });
    }

    public void deleteUser(String email){

        SQLiteDatabase db = this.getWritableDatabase();

        db.delete("users", "email=?", new String[] { email });
    }
}

一旦“SqliteHelper.java”准备就绪,转到“MainActivity.java”,  按照以下步骤实现“SQLite数据库”  选项:

  • 声明并实例化一个“SqliteHelper”类变量,如下所示:
    public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener,
            AdapterView.OnItemSelectedListener{
    
        private String email, gender, hobbies, zodiac;
    
        SqliteHelper sqliteHelper;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            sqliteHelper = new SqliteHelper(this);
    
            // omitted
  • 将用于写入数据库的代码添加到“save()”方法,如下所示:
    public void save(View view) {
        
        email = ((EditText)findViewById(R.id.txtEmail)).getText().toString();
    
        if (email.isEmpty()){
            Toast.makeText(getApplicationContext(), "Email cannot be empty!", Toast.LENGTH_LONG).show();
            return;
        }
    
        boolean result = sqliteHelper.saveUser(email, gender,  hobbies,  zodiac);
        if (result){
            Toast.makeText(getApplicationContext(), "Successfully saved!", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "Failed to save!", Toast.LENGTH_LONG).show();
        }
    }
  • 将用于从数据库读取的代码添加到“retrieve()”方法,如下所示:
    public void retrieve(View view) {
    
        email = ((EditText)findViewById(R.id.txtEmail)).getText().toString();
    
        Cursor cursor = sqliteHelper.getUser(email);
        if (cursor.getCount() != 0) {
            cursor.moveToFirst();
            email = cursor.getString(cursor.getColumnIndex("email"));
            gender = cursor.getString(cursor.getColumnIndex("gender"));
            hobbies = cursor.getString(cursor.getColumnIndex("hobbies"));
            zodiac = cursor.getString(cursor.getColumnIndex("zodiac"));
            if (!cursor.isClosed()) {
                cursor.close();
            }
        } else {
            email = "";
            gender = "";
            hobbies = "";
            zodiac = "";
        }
    
        setupUI();
    }
  • 将要从数据库中删除的代码添加到“delete()”方法中,如下所示:
    public void delete(View view) {
    
        email = ((EditText)findViewById(R.id.txtEmail)).getText().toString();
    
        sqliteHelper.deleteUser(email);
    
        email = gender = hobbies = zodiac = "";
    
        setupUI();
    }

测试1,2,3,......

在真实设备或AVD上启动应用程序,您应该看到视图如图1所示。输入电子邮件,进行一些选择,然后单击Save 按钮将输入值保存到名为“users”的数据库表中每次使用新电子邮件值保存都会导致将新记录插入“用户”表中。另一方面,每次使用已存在于数据库中的电子邮件值进行保存将导致在“users”表中更新现有记录要检索记录,请在“电子邮件”文本字段中输入该记录的电子邮件,然后按Retrieve 按钮。要删除记录,只需在“电子邮件”文本字段中输入该记录的电子邮件,然后按Delete 按钮即可。

最后但并非最不重要的

当SQLite数据库关闭时,调用“getWritableDatabase()”“getReadableDatabase()”方法不可避免地会消耗昂贵的资源和时间。因此,你应该推迟调用它们,直到真正需要它们为止。但是,一旦成功打开,数据库就会被缓存,您可以在需要写入数据库时​​调用这些方法,而不会受到任何惩罚。只要需要,就应该打开数据库连接,以利用数据库缓存。关闭数据库的一种可靠方法是在调用活动的生命周期结束时,即:

@Override
protected void onDestroy() {
    sqliteHelper.close();
    super.onDestroy();
}

你在等什么?将此代码添加到“MainActivity.java”中!

使用Android上的SQLite数据库对数据执行CRUD,即创建,读取,更新和删除 转载https://www.codesocang.com/appboke/39140.html

技术博客阅读排行

最新文章