详解Android数据存储—使用SQLite数据库

SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库。Android提供了3种操作数据的方式,SharedPreference(共享首选项)、文件存储以及SQLite数据库。

SQLite数据库文件被保存在/data/data/package_name/databases目录下。

一、创建和删除表

1.创建表

创建表的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,"// Attention:注意SQL语法,每个变量后需要有空格,否则不认识。 +PASSWORD+" TEXT," +AGE+" TEXT);"; db.execSQL(sql);

2.删除表

SQL语句为:

DROP TABLE userInfo_brief;

对应的java代码为:

String sql="DROP TABLE "+TABLENAME+";"; db.execSQL(sql);

二、操作数据库中的记录

1.插入记录

insert用法:

SQliteDatabase.insert(String table,String nullColumnHack,ContentValues values) ContentValues values=new ContentValues();//获取ContentValues对象,类似HashMAP values.put(DatabaseHelper.NAME, name);//键值对形式保存数据 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");//要更新的数据 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个参数)。

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);//设置关联属性,表与属性间.隔开,属性以=连接 cursor=builder.query(7个属性);//7属性同单表查询

实例—通过数据库验证登录

1.数据库设计

使用了数据库帮助类,从写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 自动生成的构造函数存根 } @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实例化,用于记住登录状态,判断是否需要自动登录 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() {//跳转注册界面 @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", "")); } /** * 点击登录按钮时触发的方法 */ public void userLogin() { //通过帮助类获得数据库对象 DatabaseHelper helper=new DatabaseHelper(getBaseContext()); db=helper.getReadableDatabase(); //得到用户输入信息 String usernameString = username.getText().toString(); String passwordString = password.getText().toString(); //根据用户名查询数据库信息 Cursor cursor=db.query(DatabaseHelper.TABLENAME, new String[]{DatabaseHelper.PASSWORD}, DatabaseHelper.NAME+"=?", new String[]{usernameString}, null, null, null); //若没有查询到相关信息,不再继续操作 if(cursor.getCount()==0) { Toast.makeText(getBaseContext(), "用户名不存在", Toast.LENGTH_SHORT).show(); return; } //若用户名存在,则继续操作 cursor.moveToFirst(); //指向第一条记录 String password=cursor.getString(0);//取得密码 //判断密码,若一样则进行跳转 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(); //得到数据库对象 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; } //若不存在,则插入数据 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); //进行跳转 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();// 提交修改 } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-20 00:37:18

详解Android数据存储—使用SQLite数据库的相关文章

详解Android数据存储之SQLCipher数据库加密_Android

前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发生呢?我们尝试这对数据库进行加密. 选择加密方案:  1.)第一种方案  我们可以对数据的数据库名,表名,列名就行md5,对存储的数据进行加密,例如进行aes加密(Android数据

详解Android数据存储之SQLCipher数据库加密

前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发生呢?我们尝试这对数据库进行加密. 选择加密方案: 1.)第一种方案 我们可以对数据的数据库名,表名,列名就行md5,对存储的数据进行加密,例如进行aes加密(Android数据加密

详解Android数据存储之Android 6.0运行时权限下文件存储的思考_Android

前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了. 背景: 有关外置sdcard的读写权限 <uses-permission android:name="android.permissi

详解Android数据存储之Android 6.0运行时权限下文件存储的思考

前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了. 背景: 有关外置sdcard的读写权限 <uses-permission android:name="android.permissi

实例详解Android文件存储数据方式_Android

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.下面通过本文给大家介绍Android文件存储数据方式. 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法. 创建的存储文件保存在/data/data/<package name>/files文件夹下. 2.操作. 保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式. 读取文件内容:通

实例详解Android文件存储数据方式

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.下面通过本文给大家介绍Android文件存储数据方式. 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法. 创建的存储文件保存在/data/data/<package name>/files文件夹下. 2.操作. 保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式. 读取文件内容:通

Android数据存储之SQLite使用_Android

SQLite是一款开源的.嵌入式关系型数据库,第一个版本Alpha发布于2000年.SQLite在便携性.易用性.紧凑性.高效性和可靠性方面有着突出的表现. 在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下. 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的形式存在 -以B-Tree的数据结构形式存储在硬盘 SQLite的数据类型: SQLite支

Android数据存储之SQLite使用

SQLite是一款开源的.嵌入式关系型数据库,第一个版本Alpha发布于2000年.SQLite在便携性.易用性.紧凑性.高效性和可靠性方面有着突出的表现. 在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下. 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的形式存在 -以B-Tree的数据结构形式存储在硬盘 SQLite的数据类型: SQLite支

详解Android文件存储_Android

摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安卓系统提供了不同于pc的访问文件系统根路径的api,同时对一个应用的私有文件做了统一的管理.根据我的经验,初学者在这部分感到很容易混淆内部存储和外部存储两个概念. 相