今天學習的內容是Android中的SQLite數據庫操作,在講解這個內容之前小編在前面有一篇博客也是講解了SQLite數據庫的操作,而那篇博客的講解是講述了
如何在Window中通過DOM來操作數據庫了,如果沒有看的同學可以點擊一下看看,而這次講解的是如何通過Android中提供的類來對數據庫進行操作
在講解這個知識點之前我們要列舉今天筆記目錄,這樣也許你看到我的博客就知道我在講解什么了,同時在移動端的數據保存不當當讀寫在數據庫中,而有時候我們也會對文件
或者有一下XML進行我們的數據存儲,我會重文件讀寫開始然后再到數據的操作,這樣我們就能夠對Android中數據存儲操作有個大概的了解
目錄
Android中三種存儲方式
1.文件存儲:
核心:通過Context類獲得openFileInput()和opendFileOutput()之后通過文件流的方式讀寫數據操作
兩個方法的參數
參數1:指定要傳入的數據格式:"data"
參數2:指定要操作的模式.MODE_PRIVATE和MODE_APPEND
MODE_PRIVATE:是默認模式,當你指定同樣的文件名的時候,所寫入的數據將會覆蓋源文件的內容
MODE_APPEND:而如果文件以存在則會追加原有文件的內容,不存在着創建新的文件
2.SharedPreference存儲
要通過SharedPreference方式操作數據存儲則必須活動SharedPreference對象,獲取該對象的方式有三種形式
1.Context.getSharedPreference():
2.Actvity類中的getPrerence()
3.PreferenceManager類中的getDefaultSharedPreference()
獲取SharedPreference對象之后通過.edit()方法來獲得一個SharedPreference.Editor對象
然后調用對象中的put方法 然后調用commit()方法則實現數據存儲操作
3.數據庫存儲
認識SQLiteOpenHelper輔助類:借助這個類可以進行數據庫創建和升級
1.SQLiteOpenHelper是一個抽象類,如果要使用的話則需要通過一個類來繼承它,然后重寫該類中的onCreate()和onUpgrade()方法
2.如果要創建一個數據庫着需要調用getReadableDatabase()和getWriteableDatabase(),如果數據庫存在着打開,如果不存在着創建一個新數據庫 ,
注意,當數據庫不可寫入時(磁盤空間已滿)getReadableDatabase()方法返回的對象將對只讀方式打開數據庫,而getWriteableDatabase()則會報異常
以上是小編大致列舉這篇博客的目錄內容,這樣好讓大家能夠明白原來在Android中不往往通過數據庫來存放數據的,起碼我們要會對文件的讀寫要有定的認識,那趕緊進入我們學習的內容吧
1.文件存儲:
相信大家學習過java的同學對java中的文件輸入輸出流有大致的認識了,也熟悉的運用過進行文件的讀寫操作,那在Android中也是同樣如此,可以通過輸入輸出流對我們的文件進行讀寫操作
1.我們新建一個Android工程,這是必須的
我們通過文件存儲方式實現登錄保存用戶帳號和密碼的操作
新建工程完畢之后我們
1.打開我們的layout--->activity_main 布局文件添加兩個EditeView控件,並且指定一個唯一Id,一會我們要引用該控件
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.filewriteandread.MainActivity"
android:orientation="vertical" >
<EditText
android:id="@+id/ed_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入帳號..."
/>
<EditText
android:id="@+id/ed_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:password="true"
android:hint="請輸入密碼..."
/>
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登錄"
/>
</LinearLayout>
2.編寫我們的控件代碼 MainActivity.java 獲取我們的控件對象
package com.example.filewriteandread; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; public class MainActivity extends Activity{ private Button btn1 ; private EditText ed_name ; private EditText ed_pass ; //定義一個文件輸入流對象 FileOutputStream out = null ; FileInputStream input = null ; BufferedReader read = null;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ed_name =(EditText)findViewById(R.id.ed_name); ed_pass = (EditText)findViewById(R.id.ed_pass); btn1 = (Button)findViewById(R.id.btn1);
} }
3.給登錄按鈕綁定一個監聽事件,當我們點擊該登錄操作時就實現數據的保存操作
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = ed_name.getText().toString() ;
String pass = ed_pass.getText().toString() ;
try {
out = MainActivity.this.openFileOutput("data", MODE_PRIVATE);
out.write((name+"##"+pass).getBytes()) ;
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {e.printStackTrace();}
}
}
});
openFileOutput("文件名",默認讀寫形式);
在這里你會看到我不是直接通過new FileOupStream去獲取使用文件輸出流對象,而是通過上下文對(Activity)來獲得的,所以以后想要獲得一個輸入輸出對則可以
通過Context類的openFileInput()和opendFileOutput()方法獲得流對象,之后通過文件流的方式讀寫數據操作
執行以上代碼運行,打開DDMS 你會看到你的工程目錄下會多一個文件
接下來是讀數據了,將讀到的數據保存到編輯組件中,我們編寫一個readDate()方法,同樣通過Context類的openFileInput()獲得流對象,之后通過文件流的方式讀寫數據操作‘
public void readData(){
FileInputStream input =null;
BufferedReader read = null;
try {
input = this.openFileInput("data");
if(input!=null){
//獲取一個字符流對象
read = new BufferedReader(new InputStreamReader(input));
String[] str = read.readLine().split("##");
ed_name.setText(str[0]);
ed_pass.setText(str[1]);
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
input.close() ;
read.close();
} catch (IOException e) {e.printStackTrace();}
}
}
3.編譯運行
package com.example.filewriteandread;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity{
private Button btn1 ;
private EditText ed_name ;
private EditText ed_pass ;
//定義一個文件輸入流對象
FileOutputStream out = null ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_name =(EditText)findViewById(R.id.ed_name);
ed_pass = (EditText)findViewById(R.id.ed_pass);
readData();
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = ed_name.getText().toString() ;
String pass = ed_pass.getText().toString() ;
try {
out = MainActivity.this.openFileOutput("data", MODE_PRIVATE);
out.write((name+"##"+pass).getBytes()) ;
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
out.close();
} catch (IOException e) {e.printStackTrace();}
}
}
});
}
public void readData(){
FileInputStream input =null;
BufferedReader read = null;
try {
input = this.openFileInput("data");
if(input!=null){
//獲取一個字符流對象
read = new BufferedReader(new InputStreamReader(input));
String[] str = read.readLine().split("##");
ed_name.setText(str[0]);
ed_pass.setText(str[1]);
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
input.close() ;
read.close();
} catch (IOException e) {e.printStackTrace();}
}
}
}
2.SharedPreference存儲方式
其實這種方式和文件存放方式操作一樣,只是它生成的文件格式是XMl形式的,往往是以鍵值對的形式存放數據,我新建一個工程給大家演示一下
這次操作我們就不學匿名內部類的形式了,而這次我寫內部類的形式,這樣大家就可以知道其實內部類在安卓中運用可多了,內部類有好幾種,如果想知道的同學也可以查看一下我的博客內部類的講解
接下來我定義一個內部類,代碼編寫如下
class MyBtnListener implements OnClickListener{
@Override
public void onClick(View v) {
//獲取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString();
SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ;
editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
}
}
首先我是通過
PreferenceManager.getDefaultSharedPreferences(MainActivity.this)獲取SharedPreferences對象的獲取SharedPreferences對象其實不當當這一種,在目錄中我也告訴其他幾種獲取的方式
大家可以嘗試一下
再然后我是通過該 對象.edit()獲取的SharedPreferences.Editor對象的,這個對象作用相當我們的數據庫中JDBC的statement語句對象,用於對數據的封裝操作的提供了相應的putXX方法
用於封裝不同類型的數據,然后封裝完數據后一定要記住要提交事務操作
完整代碼如下
package com.example.filewriteandread2;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText ed_test1;
private EditText ed_test2;
private Button btn1 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test1 = (EditText)findViewById(R.id.ed_test1);
ed_test2 = (EditText)findViewById(R.id.ed_test2);
btn1 = (Button)findViewById(R.id.btn_1);
btn1.setOnClickListener(new MyBtnListener());
}
class MyBtnListener implements OnClickListener{
@Override
public void onClick(View v) {
//獲取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString();
SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ;
editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
}
}
}
接下來我們打開DDMS查看一個我們封裝的數據
我們導出該文件查詢一下,可以點擊上面這個按鈕哦!
是不是很6呢?哈哈,有同學會問既然能存放這樣的數據,那讀數據會不會很麻煩呢??其實不然,讀數據還簡單哦,可以通過PreferenceManager類中的getXXX方法獲取哦!
這次我添加一個按鈕控件,當你點擊按鈕操作獲得該文件的數據,我們實現一下吧
<Button
android:id="@+id/btn_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="獲得數據"
android:onClick="getSomeData"
/>
完整代碼如下:
package com.example.filewriteandread2;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText ed_test1;
private EditText ed_test2;
private Button btn1 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_test1 = (EditText)findViewById(R.id.ed_test1);
ed_test2 = (EditText)findViewById(R.id.ed_test2);
btn1 = (Button)findViewById(R.id.btn_1);
btn1.setOnClickListener(new MyBtnListener());
}
class MyBtnListener implements OnClickListener{
@Override
public void onClick(View v) {
//獲取文本的值
String text1 = ed_test1.getText().toString();
String text2 = ed_test2.getText().toString();
//獲取SharedPreferences對象
SharedPreferences sharePref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sharePref.edit() ;
editor.putString("text1",text1) ;
editor.putString("text2",text2) ;
editor.commit() ;
}
}
public void getSomeData(View v){
//獲取SharedPreferences對象
SharedPreferences sharePref2 = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
Toast.makeText(this,sharePref2.getString("text1", "") +"---" + sharePref2.getString("text2", ""), Toast.LENGTH_SHORT).show();
}
}
好了,以上就是通過文件進行數據的讀寫操作了,做了那么多操作,是不是很方便呢?
接下來給大家講解的就是如何在Android中通過提供的類進行操作數據庫了
3.數據庫存儲
我想大家務必已經對SQLite已經有大致的認識和我在Java中學習的MySQL,Oracle等關系型數據庫沒什么不同,唯一不同的是它的數據類型,在這小編大致列舉幾個數據類型有關SQLite的基礎學習可以
到菜鳥教程官網進行學習,這樣會幫助你更好的了解該知識內容
integer數值型 real浮點類型 blod二進制類型 text文本類型
接下來我要介紹一下實現的步驟啦
1認識SQLiteOpenHelper輔助類:借助這個類可以進行數據庫創建和升級
2.SQLiteOpenHelper是一個抽象類,如果要使用的話則需要通過一個類來繼承它,然后重寫該類中的onCreate()和onUpgrade()方法
3.如果要創建一個數據庫着需要調用getReadableDatabase()和getWriteableDatabase(),如果數據庫存在着打開,如果不存在着創建一個新數據庫 ,
1.定義步驟我們編寫一個類型來繼承這個輔助類通過重寫輔助類的onCreate() onUpgrade()方法實現創建和升級操作
package com.example.databaseoperation;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK ="create table Book ("
+"id integer primary key autoincrement, "
+"bname text,"
+"authod text, "
+"price real, "
+"pages integer)";
private Context mContext ;
public MyDatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context ;
}
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println(CREATE_BOOK);
db.execSQL(CREATE_BOOK);
//創建成功后提示
Toast.makeText(mContext, "數據庫和數據庫表創建成功",Toast.LENGTH_SHORT).show() ;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
解讀一下以上代碼:第一:我們通過定義一個普通類來繼承SQLiteOpenHelper 這個賦值類,然后重寫該類中onCreate()和onUpgrade()方法,同時編寫一個構造方法用於獲得上下文對象,已經傳入的要創建的數據庫名,和數據庫創建的版本號,這樣我們就可以創建數據庫了,同時創建了一張Book表
2.在MainActivity中調用操作
//點擊時創建數據庫操作
btn_create.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyDatabaseHelper bHelper = new MyDatabaseHelper(this,"book.db",null,1);
dbHelper.getWritableDatabase() ;
}
});
綁定一個按鈕,通過點擊按鈕則創建數據庫
這時候我們就可以通過DOM命令來查詢一下我們自己新建的數據庫以及表是否存在
我們通過DOM進入該數據查看一下
好接下來我們給該數據庫添加數據操作
通過SQLiteDatabase.insert()方法可以添加數據到數據庫
//單擊添加按鈕時去到添加活動中 btn_add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues() ; values.put("bname", "This my first Code"); values.put("authod", "yangA"); values.put("price", 30.0); values.put("pages",3000); db.insert("book", null, values); values.clear(); values.put("bname", "This my second Code"); values.put("authod", "yangB"); values.put("price", 40.0); values.put("pages",1000); db.insert("book", null, values); Toast.makeText(DataBaseActivity.this, "添加完畢", Toast.LENGTH_SHORT).show(); } });
通過一個ContentValues對象進行數據封裝然后在執行添加操作也是通過鍵值的形式存放數據然后變量添加操作
點擊添加成功我們可以查詢一下數據是否成功添加進去
SQLiteDatabase也提供了相應的updata(),delete() 方法這些方法操作也是非常簡單,小編就不再這里演示了,希望大家嘗試一下吧,這次的講解介紹完畢了,下一章將會深入探討Android中的SQLite操作
敬請期待哦