1. 程式人生 > >Android開發學習之路--資料持久化之初體驗

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語句比較直接明瞭。關於資料庫基本也學到了這裡。

附:參考《第一行程式碼》