每个应用都涉及数据。大多数数据由用户通过各种输入控件提供,例如文本字段,复选框,单选按钮组,微调器和按钮。虽然某些数据是暂时的,但即使在应用程序停止运行后,大多数数据仍需要保留或保留。Android提供了许多用于在本地存储持久数据的巧妙技术。在本文中,您将学习使用Android 上的SQLite数据库对数据执行CRUD
,即创建,读取,更新和删除 。
在您最喜欢的Android IDE上,启动一个新的Android应用程序项目。我们给它一个应用程序名称 “AndroidSQLite”和一个域名“peterleowblog.com”。生成的项目包名称为“ com.peterleowblog.androidsqlite ”。
在项目中,创建一个名为“MainActivity”的Android活动。如图1所示,此“MainActivity” 的用户界面(UI) 包含以下控件:
用户可以键入并将新信息保存到SQLite数据库。随后,用户可以使用电子邮件作为关键字检索信息,编辑信息并将其更新到SQLite数据库中或从SQLite数据库中删除。
图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数据库涉及插入或更新操作。跟着这些步骤:
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues(); contentValues.put("gender", gender); contentValues.put("hobbies", hobbies);
result = db.insert("users", null, contentValues);
result = db.update("users", contentValues, "email=?", new String[] { email });
要在SQLite数据库上执行读取操作,请按照下列步骤操作:
SQLiteDatabase db = this.getReadableDatabase();
String sql = "SELECT * FROM users WHERE email=?"; Cursor cursor = db.rawQuery(sql, new String[] { email });
最后,要从SQLite数据库中删除数据,请按照下列步骤操作:
SQLiteDatabase db = this.getWritableDatabase();
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数据库” 选项:
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
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(); } }
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(); }
public void delete(View view) { email = ((EditText)findViewById(R.id.txtEmail)).getText().toString(); sqliteHelper.deleteUser(email); email = gender = hobbies = zodiac = ""; setupUI(); }
在真实设备或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
热门源码