詳解Android數(shù)據(jù)存儲—使用SQLite數(shù)據(jù)庫
SQLite是Android自帶的關系型數(shù)據(jù)庫,是一個基于文件的輕量級數(shù)據(jù)庫。Android提供了3種操作數(shù)據(jù)的方式,SharedPreference(共享首選項)、文件存儲以及SQLite數(shù)據(jù)庫。
SQLite數(shù)據(jù)庫文件被保存在/data/data/package_name/databases目錄下。
一、創(chuàng)建和刪除表
1.創(chuàng)建表
創(chuàng)建表的SQL語句為:
CREATE TABLE userInfo_brief ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, password TEXT);
對應的Java代碼為:
final static int VERSION=1;
final static String TABLENAME="userInfo_brief";
final static String ID="id";
final static String NAME="name";
final static String PASSWORD="password";
String sql="CREATE TABLE "+TABLENAME+"("+"ID"+" INTEGER PRIMARY KEY AUTOINCREMENT,"
+NAME+" TEXT,"http:// Attention:注意SQL語法,每個變量后需要有空格,否則不認識。
+PASSWORD+" TEXT,"
+AGE+" TEXT);";
db.execSQL(sql);
2.刪除表
SQL語句為:
DROP TABLE userInfo_brief;
對應的java代碼為:
String sql="DROP TABLE "+TABLENAME+";"; db.execSQL(sql);
二、操作數(shù)據(jù)庫中的記錄
1.插入記錄
insert用法:
SQliteDatabase.insert(String table,String nullColumnHack,ContentValues values)
ContentValues values=new ContentValues();//獲取ContentValues對象,類似HashMAP
values.put(DatabaseHelper.NAME, name);//鍵值對形式保存數(shù)據(jù)
values.put(DatabaseHelper.PASSWORD, pass);
values.put(DatabaseHelper.AGE, age);
db.insert(DatabaseHelper.TABLENAME, null, values);
2.更新記錄
update使用方法:
SQliteDatabase.update(String table,ContentValues values,String where-Clause,String[] WhereArgs)
eg:更新表中name為bob的密碼
ContentValues values=new ContentValues();
values.put(PASSWORD,"123456");//要更新的數(shù)據(jù)
db.update(TABLENAME,values,NAME+"=?",new String[]{"bob"});
3.刪除記錄
delete使用方法:
SQliteDatabase.delete(String table,String where-Clause,String[] WhereArgs)
eg:刪除那么為bob的記錄
db.delete(TABLENAME,NAME+"=?",new String[]{"bob"});
4.查詢記錄
1.單表查詢
使用SQLiteDatabase.query(7個參數(shù))。
2.多表查詢
如果A表中存了用戶名和密碼,B表中存了用戶名和其他具體信息,使用SQLiteQueryBuilder多表查詢。
SQL語句:
SELECT A.name,A.password,B.age,B.sex FROM A,B WHERE A.name=B.name AND A.name=“bob”
多表查詢步驟:
SQLiteQueryBuilder builder=new SQLiteQueryBuilder();//獲得對象 builder.setTables(TABLENAME_A,TABLENAME_B);//設置需要查詢的表,可多個 builder.appendWhere(TABLENAME_A+"."+NAME+"="TABLENAME_B+"."+NAME);//設置關聯(lián)屬性,表與屬性間.隔開,屬性以=連接 cursor=builder.query(7個屬性);//7屬性同單表查詢
實例—通過數(shù)據(jù)庫驗證登錄
1.數(shù)據(jù)庫設計
使用了數(shù)據(jù)庫幫助類,從寫onCreate方法
public class DatabaseHelper extends SQLiteOpenHelper {
final static String DATABASENAME="my_database.db";
final static int VERSION=1;
final static String TABLENAME="userInfo_detail";
final static String ID="id";
final static String NAME="name";
final static String PASSWORD="password";
final static String AGE="age";
public DatabaseHelper(Context context) {
super(context, DATABASENAME, null, VERSION);
// TODO 自動生成的構造函數(shù)存根
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 自動生成的方法存根
String sql="CREATE TABLE "+TABLENAME+"("+"ID"+" INTEGER PRIMARY KEY AUTOINCREMENT,"
+NAME+" TEXT,"
+PASSWORD+" TEXT,"
+AGE+" TEXT);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 自動生成的方法存根
}
}
2.登錄界面
public class LoginActivity extends Activity {
private EditText username;
private EditText password;
private CheckBox autoLogin;
private SharedPreferences sharedPreferences;
private String message;
SQLiteDatabase db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// MyApplication.getInstance().addActivity(this);
sharedPreferences = this.getSharedPreferences("userInfo",Context.MODE_WORLD_READABLE); //sharedPreferences實例化,用于記住登錄狀態(tài),判斷是否需要自動登錄
if (sharedPreferences.getBoolean("AUTO_ISCHECK", false)) { //自動登錄
Intent intent = new Intent();
intent.setClass(LoginActivity.this, MainActivity.class);
intent.putExtra("NAME", sharedPreferences.getString("userName", ""));
startActivity(intent);
} else {
setContentView(R.layout.login_main);
initView();
username = (EditText) findViewById(R.id.accountEdittext);
password = (EditText) findViewById(R.id.pwdEdittext);
Button btn_login=(Button) findViewById(R.id.login_in);
Button btn_register=(Button)findViewById(R.id.register);
btn_register.setOnClickListener(new OnClickListener() {//跳轉(zhuǎn)注冊界面
@Override
public void onClick(View v) {
// TODO 自動生成的方法存根
Intent intent=new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
btn_login.setOnClickListener(new OnClickListener() { //判斷登錄
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
userLogin();
}
});
}
}
/**
* 初始化視圖控件
*/
public void initView() {
Log.i(TAG, "初始化視圖控件");
username = (EditText) findViewById(R.id.accountEdittext);
password = (EditText) findViewById(R.id.pwdEdittext);
autoLogin = (CheckBox) findViewById(R.id.checkBox1);
// 默認記住用戶名
username.setText(sharedPreferences.getString("userName", ""));
}
/**
* 點擊登錄按鈕時觸發(fā)的方法
*/
public void userLogin() {
//通過幫助類獲得數(shù)據(jù)庫對象
DatabaseHelper helper=new DatabaseHelper(getBaseContext());
db=helper.getReadableDatabase();
//得到用戶輸入信息
String usernameString = username.getText().toString();
String passwordString = password.getText().toString();
//根據(jù)用戶名查詢數(shù)據(jù)庫信息
Cursor cursor=db.query(DatabaseHelper.TABLENAME, new String[]{DatabaseHelper.PASSWORD},
DatabaseHelper.NAME+"=?", new String[]{usernameString}, null, null, null);
//若沒有查詢到相關信息,不再繼續(xù)操作
if(cursor.getCount()==0)
{
Toast.makeText(getBaseContext(), "用戶名不存在", Toast.LENGTH_SHORT).show();
return;
}
//若用戶名存在,則繼續(xù)操作
cursor.moveToFirst(); //指向第一條記錄
String password=cursor.getString(0);//取得密碼
//判斷密碼,若一樣則進行跳轉(zhuǎn)
if(password.equals(passwordString)){
if(autoLogin.isChecked()){
Editor editor=sharedPreferences.edit();
editor.putString("userNAME", usernameString);
editor.putBoolean("AUTO_ISCHECK", true);
editor.commit();
}
Intent intent=new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("NAME",usernameString);
startActivity(intent);
}
else
{
// Editor editor = sharedPreferences.edit();
// editor.putString("userName", usernameString);
// editor.commit();
Toast.makeText(getBaseContext(), "密碼錯誤", Toast.LENGTH_SHORT).show();
}
}
}

3.注冊界面
public class RegisterActivity extends Activity {
String name;
String pass;
String age;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO 自動生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
final EditText et_userName=(EditText)findViewById(R.id.editText_1);
final EditText et_password=(EditText)findViewById(R.id.editText_2);
final EditText et_age=(EditText)findViewById(R.id.editText_3);
Button btn_confirm=(Button)findViewById(R.id.register_confirm);
btn_confirm.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成的方法存根
name=et_userName.getText().toString();
pass=et_password.getText().toString();
age=et_age.getText().toString();
//得到數(shù)據(jù)庫對象
DatabaseHelper helper=new DatabaseHelper(getBaseContext());
db=helper.getWritableDatabase();
//判斷用戶名是否已存在
Cursor cursor=db.query(DatabaseHelper.TABLENAME, new String[]{DatabaseHelper.NAME},
DatabaseHelper.NAME+"=?", new String[]{name}, null, null, null);
//若查詢目標已存在
if(cursor.getCount()>0){
Toast.makeText(getBaseContext(), "用戶名已存在", Toast.LENGTH_SHORT).show();
return;
}
//若不存在,則插入數(shù)據(jù)
ContentValues values=new ContentValues();
values.put(DatabaseHelper.NAME, name);
values.put(DatabaseHelper.PASSWORD, pass);
values.put(DatabaseHelper.AGE, age);
db.insert(DatabaseHelper.TABLENAME, null, values);
//進行跳轉(zhuǎn)
Intent intent=new Intent(RegisterActivity.this, MainActivity.class);
intent.putExtra("NAME", name);
startActivity(intent);
}
});
}
}

4.登錄成功界面
public class MainActivity extends Activity {
String name;
String pass;
String age;
private Button logout;
SQLiteDatabase db;
private SharedPreferences sharedPreferences;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// MyApplication.getInstance().addActivity(this);
setContentView(R.layout.main_activity);
logout=(Button) findViewById(R.id.logout);
doQuery();//進行查詢
doShow();//進行顯示
logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成的方法存根
removeSharedPreference();
Intent intent=new Intent();
intent.setClass(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
});
}
private void doQuery() {
// TODO 自動生成的方法存根
name=getIntent().getExtras().getString("NAME");
DatabaseHelper helper=new DatabaseHelper(getBaseContext());
db=helper.getReadableDatabase();
//準備查詢de屬性
String[] columns=new String[]{DatabaseHelper.PASSWORD,DatabaseHelper.AGE};
Cursor cursor=db.query(DatabaseHelper.TABLENAME, columns, DatabaseHelper.NAME+"=?",
new String[]{name}, null, null, null);
cursor.moveToFirst();
while(!cursor.isAfterLast()){//判斷是否是最后一條記錄
pass=cursor.getString(0);
age=cursor.getString(1);
cursor.moveToNext();
}
}
private void doShow() {
// TODO 自動生成的方法存根
TextView tv_show=(TextView)findViewById(R.id.show1);
tv_show.setText("用戶信息如下:\n"+"賬戶:"+name+"\n密碼"+pass+"\n年齡"+age);
}
public void removeSharedPreference() {
sharedPreferences = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();
//editor.remove("userName");
editor.remove("AUTO_ISCHECK");
editor.commit();// 提交修改
}
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android ViewGroup事件分發(fā)和處理源碼分析
這篇文章主要為大家介紹了Android ViewGroup事件分發(fā)和處理源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Android使用PowerImageView實現(xiàn)播放強大的ImageView動畫效果
今天我們就來編寫一個PowerImageView控件,讓它既能支持ImageView控件原生的所有功能,同時還可以播放GIF圖片2018-05-05
Android 中ViewPager中使用WebView的注意事項
這篇文章主要介紹了Android 中ViewPager中使用WebView的注意事項的相關資料,希望通過本文大家在使用過程中遇到這樣的問題解決,需要的朋友可以參考下2017-09-09
Android利用Flutter實現(xiàn)立體旋轉(zhuǎn)效果
本文主要介紹了Flutter繪圖如何使用ImageShader填充圖形,并且利用 Matrix4的三維變換加上動畫實現(xiàn)了立體旋轉(zhuǎn)的動畫效果,感興趣的可以嘗試一下2022-06-06
Android使用AsyncQueryHandler實現(xiàn)獲取手機聯(lián)系人功能
這篇文章主要為大家詳細介紹了Android使用AsyncQueryHandler實現(xiàn)獲取手機聯(lián)系人功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android ViewFlipper翻轉(zhuǎn)視圖使用詳解
這篇文章主要為大家詳細介紹了Android ViewFlipper翻轉(zhuǎn)視圖的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
詳解Android端與JavaWeb傳輸加密(DES+RSA)
這篇文章主要介紹了詳解Android端與JavaWeb傳輸加密(DES+RSA),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

