详解Android数据存储—使用SQLite数据库
程序员文章站
2023-12-03 08:28:04
sqlite是android自带的关系型数据库,是一个基于文件的轻量级数据库。android提供了3种操作数据的方式,sharedpreference(共享首选项)、文件存...
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();// 提交修改 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
sqlserver数据库使用存储过程和dbmail实现定时发送邮件
-
详解Android数据存储—使用SQLite数据库
-
C#操作SQLite数据库帮助类详解
-
详解使用navicat连接远程linux mysql数据库出现10061未知故障
-
Android 使用ContentObserver监听数据库内容是否更改
-
Android登录注册功能 数据库SQLite验证
-
Oracle中 关于数据库存储过程和存储函数的使用
-
Android编程之SQLite数据库操作方法详解
-
Android数据持久化之SQLite数据库用法分析
-
Android 数据存储之 FileInputStream 工具类及FileInputStream类的使用