一个较为成熟的手机软件APP都需要一个数据库对于用户使用情况进行记录以及对于软件运行情况,以及简单数据进行记录。同时考虑到手机软件开发尽量做小,降低开发成本,增加反应速度等因素。sqlite数据库在这方面是做的挺好的,作为一款轻型嵌入式的数据库。能够直接嵌入到我们开发的手机APP中,对于存储类似于我们日常用到的使用例如用户账号密码、用户基本数据等,同时也可以作为用户数据的缓存机制,比如本人制作的基于百度地图的消防水源管理系统客户端就是利用sqlite进行水源信息的存储https://download.csdn.net/download/qq_41562408/10679557密码账号为111,后期构建服务器就可以将其转换为一个用户数据缓存机制,用户可以在网络不是很好的情况下,进行水源的基本管理,在网络环境好的情况下便可对数据进行上传更新。所以就要求简单数据存储,较快反应速度来说,本人觉得使用sqlite是一款较好的选择。不过对于服务器来说还是运用MySQL、SqlServer要适合一些。废话不多说,进入本文主题:
本文主要介绍sqlite在Androidstudio中运用的注意事项以及简单但是较为常用的操作进行介绍,里面有不少本人在运用时踩到雷,运行失败,Androidstudio还没有报错,这是最伤人的。究其原因,往往就是那几句容易让人忽略的代码。这些本人都会在这篇文章进行体现。与君共勉吧!
sqlite以及Androidstudio的安装这里就不介绍了,本人使用的版本为:sqlite3、Androidstudio3.0。首先看过我之前的文章的人知道,在进行项目开发时的基本套路,关防火墙、杀毒软件。本文就以一个简易的班级学生信息管理APP为例进行介绍sqlite数据库在Androidstudio项目开发中的注意事项和简单的增删改查。(在文章的后面我对把这次项目进行分享,还有一个比较好用的参考工具哦!)
对于sqlite中对于数据库的增删改查有两种操作形式,一种是sql语句进行操作,一种是谷歌工程师为开发员打包好的方法。对于第一种优点,操作灵活,能够适用数据库的所有操作,缺点是容易出错。第二种正好和第一种相反。缺点操作不够灵活,当面对两张以上表的时候就有些力不从心,优点是不易出错。
对第一种核心代码举例:
bd.execSQL("insert into info(name,phone) values(?,?);",new Object[]{"张三","135173687"});//增
bd.execSQL("delete from info where name=?",new Object[]{"张三"});//删
bd.execSQL("update info set phone=? where name=?",new Object[]{"348935439","张三"});//改
bd.execSQL("select form info where name=?",new Object[]{"张三"});//查
对于第二种核心代码
ContentValues values=new ContentValues();
values.put("name","王五");
values.put("phone","110");//增
bd.delete("info","name=?",new String[]{"王五"});//删
ContentValues values=new ContentValues();
values.put("phone","114");
bd.update("info",values,"name=?",new String[]{"王五"});//改
Cursor cursor=bd.query("info",new String[]{"name","phone"},"name=?",new String[]{"王五"},null,null,null);//查
1、首先创建项目:项目名称为学员学籍管理系统,包名就选用com.jingda.mnfz这些都不重要,你爱叫啥就叫啥。
2、进行学籍管理系统界面设计,这里只是为了介绍sqlite的用法,所以就一切从简,之后笔者会分析一个较为好看一点的学籍管理系统,美工能力不行,见谅! 本项目设计三个界面(首页、增加以及修改界面、查询界面)
(1)首页页面布局如下:
ps:该代码。。。。。。。。部分为你Androidstudio创建页面时默认代码不需要修改。
(2)增加及修改页面设计
布局设计为:
界面布局为:
ps:该界面较为简单就添加一个listview便可,其他默认。
(4)数据库结构设计
该项目只是做一个较为简易的学员管理系统,逻辑较为简单,读者可以在此基础上加以美化修改。
主键(primary key) | autoincrement |
学号(id) | varchar(20) |
姓名(name) | varchar(20) |
年龄(age) | int |
性别(sex) | Boolean |
创建Java类:
这是创建sqlite数据库必须一步,用于创建数据库、表、属性的初始化、更新等操作。根据我们的项目数据库设计数据库设计如下:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelp extends SQLiteOpenHelper {
public MyOpenHelp(Context context) {
super(context, "xueji.db", null, 1);
}
/**
* 当数据库第一次调用时
* 特别适合做表结构的初始化
* @param sqLiteDatabase
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table xuesheng(_id integer primary key autoincrement,id varchar(20),name varchar(20),age int,sex Boolean)");
}
/**
* 用于数据库更新
* @param sqLiteDatabase
* @param i
* @param i1
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
(5)创建学生类javabean(为了操作方便)代码如下:
package mnfz.jingda.com;
public class XueShen {
private String ID;
private String NAME;
private int AGE;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getNAME() {
return NAME;
}
public void setNAME(String NAME) {
this.NAME = NAME;
}
public int getAGE() {
return AGE;
}
public void setAGE(int AGE) {
this.AGE = AGE;
}
public String getSEX() {
return SEX;
}
public void setSEX(String SEX) {
this.SEX = SEX;
}
private String SEX;
}
(6)创建item.xml用于列表显示
布局为:
(7)创建基础类 BaseActivity用于提取重复代码,实现各功能模块之间的数据交互。
package mnfz.jingda.com; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; import android.widget.Toast; public class BaseActivity extends Activity{ public static String GongNeng="kong"; public static String z_ID="001"; public static String z_NAME="001"; public static String z_AGE="001"; public static String z_SEX="001"; public static int i=0; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void Show(CharSequence text){ Toast.makeText(getApplicationContext(),text,Toast.LENGTH_SHORT).show(); } }
(8)添加以及修改逻辑
package mnfz.jingda.com; import android.content.ContentValues; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.renderscript.ScriptC; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Toast; public class addActivity extends BaseActivity { private MyOpenHelp myOpenHelper; private EditText xuehao; private EditText name; private EditText age; private RadioGroup sex; private String xingbie; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add); myOpenHelper=new MyOpenHelp(getApplicationContext()); Show(GongNeng); xuehao=(EditText)findViewById(R.id.xuehao); name=(EditText)findViewById(R.id.name); age=(EditText)findViewById(R.id.age); sex=(RadioGroup)findViewById(R.id.sex); sex.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup radioGroup, int i) { if (i==R.id.man){ xingbie="男"; }else { xingbie="女"; } } }); if (GongNeng=="XIUGAI"){ name.setText(z_NAME); age.setText(z_AGE); xuehao.setText(z_ID); } } public void queren(View view) { if (GongNeng=="TIANJIA"){ if (xuehao.getText().toString().length()==0){ Show("学号不能为空!"); return; } String XH=xuehao.getText().toString(); String NM=name.getText().toString(); String AG=age.getText().toString(); String SX=xingbie; GongNeng="kong"; SQLiteDatabase bd=myOpenHelper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("id",XH); values.put("name",NM); values.put("age",AG); values.put("sex",SX); long insert= bd.insert("xuesheng",null,values); if (insert>0){ Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(getApplicationContext(),"添加失败",Toast.LENGTH_SHORT).show(); } bd.close();//数据库用完关闭 startActivity(new Intent(addActivity.this,MainActivity.class)); }else if (GongNeng=="CHAXUN"){ i=panduan(); GongNeng="kong"; z_ID=xuehao.getText().toString();z_NAME=name.getText().toString();z_AGE=age.getText().toString();z_SEX=xingbie; startActivity(new Intent(addActivity.this,findActivitv.class)); }else if (GongNeng=="XIUGAI"){ Show("学号不能修改,只能删除!!!!"); SQLiteDatabase db=myOpenHelper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("name",name.getText().toString()); values.put("age",age.getText().toString()); values.put("sex",xingbie); db.update("xuesheng",values,"id=?",new String[]{z_ID}); db.close(); GongNeng="kong"; startActivity(new Intent(addActivity.this,findActivitv.class)); }else Show("服务器超时!!!"); } public void fanhui(View view) { GongNeng="kong"; startActivity(new Intent(addActivity.this,MainActivity.class)); } private int panduan(){ boolean a=false; boolean b=false; boolean c=false; boolean d=false; if (xuehao.getText().toString().length()!=0){ a=true; } if (name.getText().toString().length()!=0){ b=true; } if (age.getText().toString().length()!=0){ c=true; } if (xingbie!=null){ d=true; } if (a==true&&b==true&&c==true&&d==true) return 1; if (a==true&&b==true&&c==true&&d==false) return 2; if (a==true&&b==true&&c==false&&d==true) return 3; if (a==true&&b==true&&c==false&&d==false) return 4; if (a==true&&b==false&&c==true&&d==true) return 5; if (a==true&&b==false&&c==true&&d==false) return 6; if (a==true&&b==false&&c==false&&d==true) return 7; if (a==true&&b==false&&c==false&&d==false) return 8; if (a==false&&b==true&&c==true&&d==true) return 9; if (a==false&&b==true&&c==true&&d==false) return 10; if (a==false&&b==true&&c==false&&d==true) return 11; if (a==false&&b==true&&c==false&&d==false) return 12; if (a==false&&b==false&&c==true&&d==true) return 13; if (a==false&&b==false&&c==true&&d==false) return 14; if (a==false&&b==false&&c==false&&d==true) return 15; if (a==false&&b==false&&c==false&&d==false) return 16; return 0; } }
(9)查询及删除逻辑
package mnfz.jingda.com; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Switch; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class findActivitv extends BaseActivity { private ListView xianshi; private MyOpenHelp myOpenHelper; private Liststudent; private int jishu=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_find_activitv); xianshi=(ListView)findViewById(R.id.xianshi); myOpenHelper=new MyOpenHelp(getApplicationContext()); student=new ArrayList (); SQLiteDatabase db=myOpenHelper.getReadableDatabase(); Cursor cursor=null; switch (i){ case 1:cursor=db.rawQuery("select * from xuesheng where id=? and name=? and age=? and sex=?", new String[]{z_ID,z_NAME,z_AGE,z_SEX});break; case 2:cursor=db.rawQuery("select * from xuesheng where id=? and name=? and age=?", new String[]{z_ID,z_NAME,z_AGE});break; case 3:cursor=db.rawQuery("select * from xuesheng where id=? and name=? and sex=?", new String[]{z_ID,z_NAME,z_SEX});break; case 4:cursor=db.rawQuery("select * from xuesheng where id=? and name=?", new String[]{z_ID,z_NAME});break; case 5:cursor=db.rawQuery("select * from xuesheng where id=?and age=? and sex=?", new String[]{z_ID,z_AGE,z_SEX});break; case 6:cursor=db.rawQuery("select * from xuesheng where id=?and age=?", new String[]{z_ID,z_AGE});break; case 7:cursor=db.rawQuery("select * from xuesheng where id=?and sex=?", new String[]{z_ID,z_SEX});break; case 8:cursor=db.rawQuery("select * from xuesheng where id=?", new String[]{z_ID});break; case 9:cursor=db.rawQuery("select * from xuesheng where name=? and age=? and sex=?", new String[]{z_NAME,z_AGE,z_SEX});break; case 10:cursor=db.rawQuery("select * from xuesheng where name=? and age=?", new String[]{z_NAME,z_AGE});break; case 11:cursor=db.rawQuery("select * from xuesheng where name=?and sex=?", new String[]{z_NAME,z_SEX});break; case 12:cursor=db.rawQuery("select * from xuesheng where age=?", new String[]{z_AGE});break; case 13:cursor=db.rawQuery("select * from xuesheng where age=? and sex=?", new String[]{z_AGE,z_SEX});break; case 14:cursor=db.rawQuery("select * from xuesheng where age=?", new String[]{z_AGE});break; case 15:cursor=db.rawQuery("select * from xuesheng where sex=?", new String[]{z_SEX});break; case 16:cursor=db.rawQuery("select * from xuesheng",null);break; } student.clear(); if (cursor!=null&&cursor.getCount()>0){ while (cursor.moveToNext()){ String id=cursor.getString(cursor.getColumnIndex("id")); String name=cursor.getString(cursor.getColumnIndex("name")); String Age=cursor.getString(cursor.getColumnIndex("age")); double age=Double.parseDouble(Age); String Sex=cursor.getString(cursor.getColumnIndex("sex")); XueShen xueShen=new XueShen(); xueShen.setID(id); xueShen.setNAME(name); xueShen.setAGE((int)age); xueShen.setSEX(Sex); student.add(xueShen); jishu++; }}else Show("查询0条结果"); Show("查询有"+jishu+"条数据"); xianshi.setAdapter(new MyAdepter()); } private class MyAdepter extends BaseAdapter{ @Override public int getCount() { return student.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { View v; if (view==null){ v=View.inflate(getApplicationContext(),R.layout.item,null); }else { v=view; } final TextView tv_id=(TextView)v.findViewById(R.id.xuehao); final TextView tv_name=(TextView)v.findViewById(R.id.name); final TextView tv_age=(TextView)v.findViewById(R.id.age); final TextView tv_sex=(TextView)v.findViewById(R.id.sex); Button xiugai=(Button)v.findViewById(R.id.xiugai); Button shanchu=(Button)v.findViewById(R.id.delete); int b; XueShen xueShen=student.get(i); tv_id.setText(xueShen.getID()); tv_name.setText(xueShen.getNAME()); tv_age.setText(""+xueShen.getAGE()); tv_sex.setText(xueShen.getSEX()); shanchu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SHANCHU(tv_id.getText().toString()); } }); xiugai.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { GongNeng="XIUGAI"; z_ID=tv_id.getText().toString(); z_NAME=tv_name.getText().toString(); z_AGE=tv_age.getText().toString(); z_SEX=tv_sex.getText().toString(); startActivity(new Intent(findActivitv.this,addActivity.class)); } }); return v; } private void SHANCHU(String id){ SQLiteDatabase db=myOpenHelper.getWritableDatabase(); db.execSQL("delete from xuesheng where id=?",new Object[]{id}); db.close(); GongNeng="CHAXUN"; startActivity(new Intent(findActivitv.this,addActivity.class)); } } }
至此学员管理系统基本功能以及框架以及搭建完毕。运行结果如下:ps:myOpenHelper=new MyOpenHelp(getApplicationContext());这句话没玩了,每次进行数据库操作时,我经常忘记在对这句代码添加,导致出错,头大的是又是Androidstudio还不报错,只是闪退。切记!!!!
自我感觉还算详细吧!亲测有效。由于小晖最近时间有点忙,即是一个科研创新负责人,还有写学术论文,还有训练。还要挤出时间学学服务器的部分内容。。。。所以就不进行美化。美工能力也不行。读者要是有什么不明白的,我会把这次项目分享出来。有什么好的建议,欢迎留言,相互进步嘛!!!连接为:https://download.csdn.net/download/qq_41562408/10692020 在这个资源目录里面有两个项目,一个是我们的做的这个学员管理系统,还有一个是对于sqlite数据库应用中分门别类的对于增删改查进行介绍。是一个比较好的列表工具。你值得拥有Thanks♪(・ω・)ノ。
最近时间是真的紧张,但是笔者还是挤出时间看了一部电影《抓人游戏》。里面一句经典台词令人感触很大“人不是因变老而不玩了,而是因为不玩而变老”。讲真,我是真的羡慕,希望我现在的兄弟在我们都成家立业之后还能像现在这样,相互吹嘘,打闹,玩色子、三字经、罚酒。。。。。。。即使到时候我们身体都不行了,还能有这么一个游戏来维系我们的兄弟情谊。一路走来,我收获了很多友情,兄弟情。有很多最后又失去了,仅存的这些,真的倍加珍惜,怕失去。