android-SQLite数据库MVC关联实例源码(三层架构)
前两天布置下了一个期末练习,其中的重点是两个表之间的SQLite关联操作。
拿到题目,首先需要建库和关联表,下面是代码。
我使用简单的表插入,将数据的提交卸载onCreate方法中,这样不会发生写在主线程中由于程序多次运行造成数据的多次创建。
当然写在MainActivity中也有避免多次运行的办法--通过SharedPreferences 的preferences.getBoolean设置boolean值,首次运行默认为true,在之后就全部置为false。
需要注意的是SharedPreferences本身不支持编辑,也就是不支持修改boolean isFirstRun = preferences.getBoolean("run", true);
中的值,需要调用editor启用编辑。
SharedPreferences preferences = this.getSharedPreferences("share", MODE_PRIVATE);
boolean isFirstRun = preferences.getBoolean("run", true);
SharedPreferences.Editor editor = preferences.edit();
if (isFirstRun) {
insert();
editor.putBoolean("run", false);
editor.commit();
} else {
editor.putBoolean("run", false);
editor.commit();
}
表中数据的关联需要使用映射关系。所以我们创建两个实体classInfo和stuInfo。在这个例子中因为stuInfo是外键,所以我们在stuInfo实体中创建一个classInfo
public class ClassInfo {
private int id;
private String className;
public class StuInfo {
private int id;
private int cID;
private String sName;
private String sSex;
private ClassInfo classInfo;
这只是两表关联的例子,多表之间关联的,我们也可以参照这个创建实体,创建实体后,我们就可以通过stuInfo.getClassInfo.getclassName()方法获取关联外键的字段。多表同理。
接下来写接口,这里我们只做查询到listView和增加功能作为示例。
public interface InfoDAO {
public List<StuInfo> getAllInfos();
public void addStuInfo(StuInfo stuInfo);
public List<ClassInfo> getAllClass();
}
接下来写查询方法
public List<StuInfo> getAllInfos() {
List<StuInfo> list = new ArrayList<StuInfo>();
SQLiteDatabase sdb = dbHelper.getReadableDatabase();
String sql = "Select * from stuInfo s,classInfo c Where s.id=c.id";
Cursor cursor = sdb.rawQuery(sql, null);
if(cursor!=null){
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String sName = cursor.getString(cursor.getColumnIndex("sName"));
String sSex = cursor.getString(cursor.getColumnIndex("sSex"));
String cName = cursor.getString(cursor.getColumnIndex("className"));
ClassInfo classInfo = new ClassInfo(cName);
StuInfo stuInfo = new StuInfo(id, sName, sSex, classInfo);
list.add(stuInfo);
}
cursor.close();
}
sdb.close();
return list;
}
注意看我们StuInfo类中传入的classInfo是怎么获取的(通过new classInfo实体传入关联查询得到的cName,需要生成单参数构造方法)。
通过listView显示数据。注意cName是怎么获取的。
listView = (ListView) findViewById(R.id.listView1);
stuList = dao.getAllInfos();
data = new ArrayList<Map<String, Object>>();
for (Iterator iterator = stuList.iterator(); iterator.hasNext();) {
StuInfo stuInfo = (StuInfo) iterator.next();
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", stuInfo.getId());
map.put("sName", stuInfo.getsName());
map.put("cName", stuInfo.getClassInfo().getClassName());
map.put("sSex", stuInfo.getsSex());
data.add(map);
}
simpleAdapter = new SimpleAdapter(this, data, R.layout.list_item,
new String[] { "id", "sName", "cName", "sSex" }, new int[] {
R.id.textView1, R.id.textView2, R.id.textView3,
R.id.textView4 });
listView.setAdapter(simpleAdapter);
增加页面效果。
因为spinner的数据是通过sqlite服务器获取的,所以我们需要classInfo表中的数据
final RadioButton rab2 = (RadioButton) view.findViewById(R.id.radio2);
final Spinner spinner = (Spinner) view.findViewById(R.id.spinner1);
claList = dao.getAllClass();//获取classInfo的数据赋值给数组
claList.add(0,new ClassInfo("--请选择班级--"));//首项提示
ArrayAdapter<ClassInfo> arrayAdapter = new ArrayAdapter<ClassInfo>(
this, android.R.layout.simple_spinner_dropdown_item, claList);
spinner.setAdapter(arrayAdapter);
这是一个很普通的查询方法。
之后通过arrayAdapter将它设值给spinner
之后我们还可以看到,弹出来的dialog是一个自定义的对话框
LayoutInflater inflater = getLayoutInflater().from(this);
View view = inflater.inflate(R.layout.add_item, null);
builder.setView(view);
builder.setNegativeButton("取消",
null);//注册
builder.setPositiveButton("确定", null);//注册
builder.setView(view);
final AlertDialog dialog = builder.create();
dialog.show();
dialog.getButton(Dialog.BUTTON_POSITIVE).setOnClickListener(
newOnClickListener() {
@Override
public voidonClick(View v) {
StuInfo stuInfo =
null;
ClassInfo classInfo =newClassInfo();
//dao.getAllClass();
intcID = classInfo.getId();
String name =edName.getText().toString().trim();
String rab =rab1.isChecked() ?"男":"女";
stuInfo =newStuInfo(0,cID,name,rab);
dao.addStuInfo(stuInfo);
if (name ==null) {
Toast.makeText(StuListActivity.this,"姓名不能为空!",
1000).show();
}
if(cID == -1) {
Toast.makeText(StuListActivity.this,"传入值不能为空!",
1000).show();
}
dialog.dismiss();//取消显示
showInfo();
}
});
dialog.getButton(Dialog.BUTTON_NEGATIVE).setOnClickListener(
newOnClickListener() {
@Override
public voidonClick(View v) {
//TODO Auto-generated method stub
dialog.dismiss();
}
});
附上源码:http://download.csdn.net/detail/jacxuan/9557633
android-SQLite数据库MVC关联实例源码(三层架构)的更多相关文章
- 45个android实例源码
分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com ...
- 分享45个android实例源码,很好很强大
分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html 分享45个android实例源码,很好很强大http://www ...
- 分享45个android实例源码,很好很强大.收藏吧!!!
andriod闹钟源代码 http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序 http://www.apkbus.com/an ...
- 45个android实例源码分享
分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码 http://www.apkbus.c ...
- 实例源码--Android日历实例源码
下载源码 技术要点: 1.Android基础控件的使用 2.Android应用开发基础框架 3.源码带有非常详细的中文 注释 ...... 详细介绍: 1. Android应用开 发技术 此套 ...
- Android基础之在Eclipes中关联SDK源码和查看SDK源码
在进行Android应用开发的时候,我们有时候需要查看某个类或接口的源码从而了解如何去使用一个类或者实现一个接口,查看源码有助于我们的学习某个封装的类的底层是如何实现的,这样可以帮助我们掌握类或者接口 ...
- MySQL数据库企业级应用实践(多实例源码编译)
MySQL数据库企业级应用实践(多实例源码编译) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机 ...
- 实例源码--Android时钟源码
下载源码 技术要点: 1.Android自定义时钟控件 2.源码带有非常详细的中文注释 ...... 详细介绍: 1.Android自定义时钟控件 通过继承视图继承类View进行自定义控制,实 ...
- JAVA上百实例源码以及开源项目
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...
随机推荐
- 封装的方法--读取任何路径下的properties文件中的值
概述:我们在做项目时,经常需要从某个properties文件中读取properties文件中的值.现在我封装了一下方法,直接读取配置文件中的值. 代码如下所示: /** * Created by qi ...
- iframe操作(跨域解决等)
note:当页面内嵌入一个iframe实际上是在dom上新建了一个新的完整的window对象 iframe中取得主窗体 window.top (顶级窗口的window对象) window.parent ...
- touchSlider插件案例
<!doctype html> <html lang="en"> <head> <title>jQuery手机图片触屏滑动轮播效果代 ...
- 免费的二维码发布平台 http://zhifubao.masao.top:8282/assets/index.html
http://zhifubao.masao.top:8282/assets/index.html
- number(NOIP模拟赛Round 3)
好吧,神奇的题目.. 原题传送门 这道题目,神奇的字符单调栈.. 首先预处理出1~n个数(大家都会.) 然后塞进字符串里,输出答案(水~) 然后.. 我们需要将所有的字符存入单调栈中,然后乱搞,就可以 ...
- Flask学习总结笔记推荐
https://blog.csdn.net/kikaylee/article/category/6551426
- Python-mysql索引
MySQL索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询 ...
- 终于遇到了传说的ie 6 img 3px的bug
最近在做一个网站,基本上已经算完成,就开始完善细节部分了. IE6可能是微软最为YD 的一款浏览器了吧,至今还没有退出历史的舞台,尽管google都宣布不在支持它了. 因为该死的ie6,虽死但是牢牢地 ...
- Appium+python自动化2-环境搭建(下)【转载】
前言 上一篇android测试开发环境已经准备好, 接下来就是appium的环境安装了.环境安装过程中切勿浮躁,按照步骤一个个来. 环境装好后,可以用真机连电脑,也可以用android-sdk里 ...
- hdu 1301(最小生成树)
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...