Android開發學習之路--資料持久化之初體驗
上班第一天,雖然工作上處於醬油模式,但是學習上依舊不能拉下,接著學習android開發吧,這裡學習資料持久化的
知識。
其實資料持久化就是資料可以儲存起來,一般我們儲存資料都是以檔案,或者資料庫的形式儲存的,android程式也有
檔案和資料庫的儲存,此外還有一種叫做SharedPreference儲存,也就是鍵值對,一般用過ios的dictionary或者
hashmap就會知道這個功能。下面學習下android中的這三種儲存資料的方式。
首先是檔案儲存的方式。新建工程FileTest,然後編寫程式碼saveToFile方法,程式碼如下:
package com.example.jared.filetest; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class MainActivity extends AppCompatActivity { private FileOutputStream fs = null; private BufferedWriter out = null; private static String file_name = "file_test1"; private static String file_data = "Save something int the file!"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); saveToFile(file_name, file_data); } public void saveToFile(String name, String data) { try { fs = openFileOutput(name, Context.MODE_PRIVATE); out = new BufferedWriter(new OutputStreamWriter(fs)); out.write(data); } catch (IOException e) { e.printStackTrace(); } finally { try { if(out != null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
這裡的fs是以MODE_PRIVATE的方式開啟一個檔案,然後通過io流來操作,因為是寫檔案,所以這裡是OutputStream
最後呼叫write方法把資料寫到檔案中去,然後在結束的時候close檔案。這裡在onCreate中就把資訊儲存到了檔案中了。
執行後可以通過DDMS來檢視檔案,關於android studio的ddms如下圖:
開啟後,在File Explorer中的data->data->com.example.jared.filetest->files下面就會新建一個file_test1的檔案
匯出這個檔案,然後檢視下內容如下所示:(這個內容在模擬器裡面,所以不能直接訪問,需要匯出,當然
現有的檔案匯入進去,上圖的➕➖符號的左邊的兩個圖示就是匯入和匯出的檔案的按鈕)
可以看到檔案內容就是我們所需要的。能把資料儲存到檔案中,那麼必須得把存入的資料讀取出來,要不然也沒有多
大意義,其實讀取和儲存差不多,這裡在實現個readFromFile方法吧。這裡結合下一個場景,比如我們在輸入帳號的時
候不小心按了back,那麼我們輸入的資訊就會全沒有了,此時如果我們輸入的資訊還儲存著的話,那麼使用者體驗會非常
的好。這裡結合readFromFile和saveToFile方法還有前面學的佈局。修改MainActivity程式碼如下:
package com.example.jared.filetest; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class MainActivity extends AppCompatActivity { private FileOutputStream fs = null; private BufferedWriter out = null; private FileInputStream fs_in = null; private BufferedReader input = null; private static String file_name = "file_test1"; private static String file_data = "Save something int the file!"; private EditText account; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //saveToFile(file_name, file_data); account = (EditText)findViewById(R.id.account); String account_read = readFromFile(file_name); if(!account_read.isEmpty()) { account.setText(account_read); account.setSelection(account_read.length()); } } @Override protected void onDestroy() { super.onDestroy(); String account_write = account.getText().toString(); saveToFile(file_name, account_write); } public void saveToFile(String name, String data) { try { fs = openFileOutput(name, Context.MODE_PRIVATE); out = new BufferedWriter(new OutputStreamWriter(fs)); out.write(data); } catch (IOException e) { e.printStackTrace(); } finally { try { if(out != null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } } } public String readFromFile(String name) { StringBuffer stringBuffer = new StringBuffer(); try { fs_in = openFileInput(name); input = new BufferedReader(new InputStreamReader(fs_in)); String line = ""; while((line = input.readLine()) != null) { stringBuffer.append(line); } } catch (Exception e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (Exception e) { e.printStackTrace(); } } } return stringBuffer.toString(); } }
這裡的readFromFile和saveToFile差不多,添加了edittext,用來輸入帳號,在onDestdroy方法中儲存了當前輸入的信
息,然後在onCreate方法中重新load這些資訊。佈局檔案如下:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jared.filetest.MainActivity">
<TableRow>
<TextView
android:text="賬號"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="22dp"/>
<EditText
android:id="@+id/account"
android:hint="請輸入賬號"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</TableRow>
</TableLayout>
這裡佈局就不多講了,執行輸入test,然後退出,然後再進入,一直是剛輸入的資訊:
接著我們學習SharedPreferences的方式。依舊剛才的例子,這裡不再新建工程了,再加上密碼,和性別的選項,布
局和效果如下:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:stretchColumns="1"
tools:context="com.example.jared.filetest.MainActivity">
<TableRow>
<TextView
android:text="賬號:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="22sp"/>
<EditText
android:id="@+id/account"
android:hint="請輸入賬號"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:text="密碼:"
android:layout_height="wrap_content"
android:layout_weight="wrap_content"
android:textSize="22sp"/>
<EditText
android:id="@+id/password"
android:hint="請輸入密碼"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:text="性別:"
android:layout_height="wrap_content"
android:layout_weight="wrap_content"
android:textSize="22sp"/>
<RadioGroup
android:id="@+id/sex"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/sex_man"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="男"/>
<RadioButton
android:id="@+id/sex_woman"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="女"/>
</RadioGroup>
</TableRow>
<TableRow>
<Button
android:id="@+id/login"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="登陸"
android:layout_span="2"/>
</TableRow>
</TableLayout>
執行效果如下所示:
接著我們來使用SharedPreferences來儲存我們輸入的內容吧。這裡用了radiobutton,因為性別是唯一的,所以用了
RadioGroup,程式碼可以參考上面的,其實和一般的控制元件也差不多,只是有些特殊的屬性。
下面簡單實現下儲存的功能,程式碼如下:
package com.example.jared.filetest;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private Button login;
private EditText account_edit;
private EditText password_edit;
private RadioGroup sex_radio;
private String accountData = null;
private String passwordData = null;
private String sexData = null;
private String file_name = "person";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
account_edit = (EditText)findViewById(R.id.account);
password_edit = (EditText)findViewById(R.id.password);
sex_radio = (RadioGroup)findViewById(R.id.sex);
sex_radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
int radioButtonId = radioGroup.getCheckedRadioButtonId();
switch (radioButtonId){
case R.id.sex_man:
sexData = "man";
break;
case R.id.sex_woman:
sexData = "woman";
break;
default:
sexData = "null";
break;
}
}
});
login = (Button)findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
accountData = account_edit.getText().toString();
passwordData = password_edit.getText().toString();
saveToSharedP(file_name, accountData, passwordData, sexData);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void saveToSharedP(String name, String account, String password, String sex) {
SharedPreferences.Editor editor = getSharedPreferences(name, MODE_PRIVATE).edit();
editor.putString("Account", account);
editor.putString("Password", password);
editor.putString("Sex", sex);
editor.commit();
}
}
然後執行程式,點選登陸按鈕:
在data->data->com.example.jared.filetest->shared_prefs下面就儲存了一個名為person.xml的檔案。
匯出後開啟檔案可以檢視內容如下:
可以看出,我們要儲存的資料都已經儲存到一個xml檔案中了。下面就來實現讀取的功能了。 修改程式碼如下:
package com.example.jared.filetest;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private Button login;
private EditText account_edit;
private EditText password_edit;
private RadioGroup sex_radio;
private String accountData = null;
private String passwordData = null;
private String sexData = null;
private String file_name = "person";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
account_edit = (EditText)findViewById(R.id.account);
password_edit = (EditText)findViewById(R.id.password);
sex_radio = (RadioGroup)findViewById(R.id.sex);
sex_radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
int radioButtonId = radioGroup.getCheckedRadioButtonId();
switch (radioButtonId){
case R.id.sex_man:
sexData = "man";
break;
case R.id.sex_woman:
sexData = "woman";
break;
default:
sexData = "null";
break;
}
}
});
readFromSharedp(file_name);
account_edit.setText(accountData);
password_edit.setText(passwordData);
if(sexData.equals("man")) {
sex_radio.check(R.id.sex_man);
} else if(sexData.equals("woman")) {
sex_radio.check(R.id.sex_woman);
}
login = (Button)findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
accountData = account_edit.getText().toString();
passwordData = password_edit.getText().toString();
saveToSharedP(file_name, accountData, passwordData, sexData);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void saveToSharedP(String name, String account, String password, String sex) {
SharedPreferences.Editor editor = getSharedPreferences(name, MODE_PRIVATE).edit();
editor.putString("Account", account);
editor.putString("Password", password);
editor.putString("Sex", sex);
editor.commit();
}
public void readFromSharedp(String name) {
SharedPreferences sharedP = getSharedPreferences(name, MODE_PRIVATE);
accountData = sharedP.getString("Account", "");
passwordData = sharedP.getString("Password", "");
sexData = sharedP.getString("Sex", "");
}
}
然後執行後重新輸入另一組賬號密碼,執行後,back退出,再開啟app後可以發現還是儲存著資料:
最後學習資料庫的方式,android資料庫是sqlite3,sqlite3是開源庫,記得在linux上用過,呼叫介面,然後通過sql語
句來實現,android這裡也是基本型別,只不過在上層封裝了一些api而已。對於資料庫主要的操作就是CRUD,也就是
增加,查詢,更新和刪除這幾個操作。
增(create):create tbl ...;
查(Retrieve):select *from tbl;
改(update):update tbl ... set ...;
刪(delete):delete from tbl where ...。
下面對於增查改刪都做一些例子。首先是增,新建工程dbtest。建立mydbhelper繼承sqliteopenhelper,程式碼如下:
package com.example.jared.dbtest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by jared on 16/2/14.
*/
public class MyDBHelper extends SQLiteOpenHelper {
public static final String CREATE_PERSON =
"create table person ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer, "
+ "height real, "
+ "sex text)";
private Context mContext;
public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_PERSON);
Toast.makeText(mContext, "Create table person success", Toast.LENGTH_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
這裡當建立資料庫的時候會呼叫onCreate方法。這裡建立了一個person表。表中有主鍵id自增,姓名,年齡,身高,
性別等。然後修改layout,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.jared.dbtest.MainActivity">
<Button
android:id="@+id/createDB"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="建立資料庫" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/addData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="新增資料"/>
<Button
android:id="@+id/updateData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新資料"/>
<Button
android:id="@+id/delData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="刪除資料"/>
<Button
android:id="@+id/queryData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查詢資料"/>
</LinearLayout>
</LinearLayout>
然後修改MainActivity的程式碼:
package com.example.jared.dbtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button createDb;
private MyDBHelper myDBHelper;
private static final String dbName = "PersonStore.db";
private static final int version = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDBHelper = new MyDBHelper(this, dbName, null, version);
createDb = (Button)findViewById(R.id.createDB);
createDb.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.createDB:
myDBHelper.getWritableDatabase();
break;
default:
break;
}
}
}
}
執行按建立資料庫的按鈕,就可以建立資料庫了。
接著我們通過adb來進入模擬器的終端,執行adb shell。在android
studio的軟體,在左下角有terminal終端裡面執行,進入root後進到對應的資料夾下面:
然後執行sqlite3 PersonStore.db,再執行.table,在執行.schema,如下所示:
具體的sqlite3命令可以通過.help檢視。
由上可知資料庫建立成功,那麼如果需要更新資料庫,需要怎麼做呢?這裡有onUpgrade方法,如果version版本變化
了,原來是1,後來升級為2了,那麼就會呼叫這個方法,而在這個方法中,可以drop原有的table,再呼叫onCreate方法
去建立。修改MyDBHelper如下:
package com.example.jared.dbtest;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by jared on 16/2/14.
*/
public class MyDBHelper extends SQLiteOpenHelper {
public static final String CREATE_PERSON =
"create table person ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer, "
+ "height real, "
+ "sex text)";
public static final String CREATE_TEACHER =
"create table teacher ("
+ "id integer primary key autoincrement, "
+ "class text )";
private Context mContext;
public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_PERSON);
sqLiteDatabase.execSQL(CREATE_TEACHER);
Toast.makeText(mContext, "Create table person success", Toast.LENGTH_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists person");
sqLiteDatabase.execSQL("drop table if exists teacher");
onCreate(sqLiteDatabase);
}
}
執行後,通過adb檢視相應目錄下的檔案,並通過sqlite3命令可以檢視對應的table有兩個,一個是person,另一個是
teacher。
接下來新增資料。修改MainActivity程式碼如下:
package com.example.jared.dbtest;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button createDb;
private Button addDataToDb;
private MyDBHelper myDBHelper;
private static final String dbName = "PersonStore.db";
private static final int version = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDBHelper = new MyDBHelper(this, dbName, null, version);
createDb = (Button)findViewById(R.id.createDB);
createDb.setOnClickListener(new myOnClickListener());
addDataToDb = (Button)findViewById(R.id.addData);
addDataToDb.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.createDB:
myDBHelper.getWritableDatabase();
break;
case R.id.addData:
addDataToPerson("xiao ming", 20, 172.5, "man");
addDataToPerson("xiao hong", 22, 160.3, "woman");
addDataToPerson("xiao li", 25, 180.5, "man");
break;
default:
break;
}
}
}
public void addDataToPerson(String name, int age, double height, String sex) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
values.put("height", height);
values.put("sex", sex);
db.insert("person", null, values);
}
}
執行後點擊新增資料按鈕,這裡會新增3條資料。通過命令列檢視資料庫資訊如下:
從上圖可知已經添加了3條資料了,新增資料成功了。
接著我們如果我們發現小明又長高了,從原來的172.5到了175了,那麼我們來更新下xiao ming的身高。修改
MainActivity程式碼:
package com.example.jared.dbtest;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button createDb;
private Button addDataToDb;
private Button updateToDb;
private MyDBHelper myDBHelper;
private static final String dbName = "PersonStore.db";
private static final int version = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDBHelper = new MyDBHelper(this, dbName, null, version);
createDb = (Button)findViewById(R.id.createDB);
createDb.setOnClickListener(new myOnClickListener());
addDataToDb = (Button)findViewById(R.id.addData);
addDataToDb.setOnClickListener(new myOnClickListener());
updateToDb = (Button)findViewById(R.id.updateData);
updateToDb.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.createDB:
myDBHelper.getWritableDatabase();
break;
case R.id.addData:
addDataToPerson("xiao ming", 20, 172.5, "man");
addDataToPerson("xiao hong", 22, 160.3, "woman");
addDataToPerson("xiao li", 25, 180.5, "man");
break;
case R.id.updateData:
updateHeight("xiao ming", 175.0);
break;
default:
break;
}
}
}
public void updateHeight(String name, double height) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("height", height);
db.update("person", values, "name = ?", new String[] {name});
}
public void addDataToPerson(String name, int age, double height, String sex) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
values.put("height", height);
values.put("sex", sex);
db.insert("person", null, values);
}
}
執行後點擊更新資料按鈕,然後通過命令列檢視如下:
xiao ming的身高已經更新為175.0了,更新的資料已經OK了。
如果我們發現多錄入了xiao li,其實xiao li已經錄入過了,那麼得刪除掉它,接著來刪除吧,程式碼如下:
package com.example.jared.dbtest;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button createDb;
private Button addDataToDb;
private Button updateToDb;
private Button delToDb;
private MyDBHelper myDBHelper;
private static final String dbName = "PersonStore.db";
private static final int version = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDBHelper = new MyDBHelper(this, dbName, null, version);
createDb = (Button)findViewById(R.id.createDB);
createDb.setOnClickListener(new myOnClickListener());
addDataToDb = (Button)findViewById(R.id.addData);
addDataToDb.setOnClickListener(new myOnClickListener());
updateToDb = (Button)findViewById(R.id.updateData);
updateToDb.setOnClickListener(new myOnClickListener());
delToDb = (Button)findViewById(R.id.delData);
delToDb.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.createDB:
myDBHelper.getWritableDatabase();
break;
case R.id.addData:
addDataToPerson("xiao ming", 20, 172.5, "man");
addDataToPerson("xiao hong", 22, 160.3, "woman");
addDataToPerson("xiao li", 25, 180.5, "man");
break;
case R.id.updateData:
updateHeight("xiao ming", 175.0);
break;
case R.id.delData:
deleteByName("xiao li");
break;
default:
break;
}
}
}
public void deleteByName(String name) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
db.delete("Person", "name = ?", new String[]{name});
}
public void updateHeight(String name, double height) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("height", height);
db.update("person", values, "name = ?", new String[] {name});
}
public void addDataToPerson(String name, int age, double height, String sex) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
values.put("height", height);
values.put("sex", sex);
db.insert("person", null, values);
}
}
執行程式碼後點擊刪除資料按鈕,然後通過命令列如下圖:
由上可知xiao li已經被刪除了。
最後來使用下查詢,比如我們要檢視年齡大於21歲的人的資訊。 程式碼如下:
package com.example.jared.dbtest;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAB = "DBTest";
private Button createDb;
private Button addDataToDb;
private Button updateToDb;
private Button delToDb;
private Button queryToDb;
private MyDBHelper myDBHelper;
private static final String dbName = "PersonStore.db";
private static final int version = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDBHelper = new MyDBHelper(this, dbName, null, version);
createDb = (Button)findViewById(R.id.createDB);
createDb.setOnClickListener(new myOnClickListener());
addDataToDb = (Button)findViewById(R.id.addData);
addDataToDb.setOnClickListener(new myOnClickListener());
updateToDb = (Button)findViewById(R.id.updateData);
updateToDb.setOnClickListener(new myOnClickListener());
delToDb = (Button)findViewById(R.id.delData);
delToDb.setOnClickListener(new myOnClickListener());
queryToDb = (Button)findViewById(R.id.queryData);
queryToDb.setOnClickListener(new myOnClickListener());
}
private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.createDB:
myDBHelper.getWritableDatabase();
break;
case R.id.addData:
addDataToPerson("xiao ming", 20, 172.5, "man");
addDataToPerson("xiao hong", 22, 160.3, "woman");
addDataToPerson("xiao li", 25, 180.5, "man");
break;
case R.id.updateData:
updateHeight("xiao ming", 175.0);
break;
case R.id.delData:
deleteByName("xiao li");
break;
case R.id.queryData:
queryByAge(21);
break;
default:
break;
}
}
}
public void queryByAge(int age) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from person where age > ?", new String[]{String.valueOf(age)});
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age1 = cursor.getInt(cursor.getColumnIndex("age"));
double height = cursor.getDouble(cursor.getColumnIndex("height"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
Log.d(TAB, "id:"+id + "| name:"+name + "| age:"+age1 + "| height:"+height + "| sex:"+sex);
}
}
public void deleteByName(String name) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
db.delete("Person", "name = ?", new String[]{name});
}
public void updateHeight(String name, double height) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("height", height);
db.update("person", values, "name = ?", new String[] {name});
}
public void addDataToPerson(String name, int age, double height, String sex) {
SQLiteDatabase db = myDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("age", age);
values.put("height", height);
values.put("sex", sex);
db.insert("person", null, values);
}
}
執行效果如下:
02-14 09:14:59.100 29182-29182/com.example.jared.dbtest D/DBTest: id:2| name:xiao hong| age:22| height:160.3| sex:woman
顯然年齡為20的xiao ming沒有打印出來,我們需要查詢的是年齡大於21歲的人,在資料庫中就是xiao hong了。這裡的查詢直接用的sql語句,其實還是sql語句比較直接明瞭。關於資料庫基本也學到了這裡。
附:參考《第一行程式碼》