前两天布置下了一个期末练习,其中的重点是两个表之间的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关联实例源码(三层架构)的更多相关文章

  1. 45个android实例源码

    分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com ...

  2. 分享45个android实例源码,很好很强大

    分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html 分享45个android实例源码,很好很强大http://www ...

  3. 分享45个android实例源码,很好很强大.收藏吧!!!

    andriod闹钟源代码 http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序 http://www.apkbus.com/an ...

  4. 45个android实例源码分享

    分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码 http://www.apkbus.c ...

  5. 实例源码--Android日历实例源码

      下载源码   技术要点: 1.Android基础控件的使用 2.Android应用开发基础框架 3.源码带有非常详细的中文 注释 ...... 详细介绍: 1. Android应用开 发技术 此套 ...

  6. Android基础之在Eclipes中关联SDK源码和查看SDK源码

    在进行Android应用开发的时候,我们有时候需要查看某个类或接口的源码从而了解如何去使用一个类或者实现一个接口,查看源码有助于我们的学习某个封装的类的底层是如何实现的,这样可以帮助我们掌握类或者接口 ...

  7. MySQL数据库企业级应用实践(多实例源码编译)

    MySQL数据库企业级应用实践(多实例源码编译) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机 ...

  8. 实例源码--Android时钟源码

      下载源码   技术要点: 1.Android自定义时钟控件 2.源码带有非常详细的中文注释 ...... 详细介绍: 1.Android自定义时钟控件 通过继承视图继承类View进行自定义控制,实 ...

  9. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

随机推荐

  1. zepto方法

    1.$.inArray $.inArray v1.0+ $.inArray(element, array, [fromIndex]) ⇒ number 搜索数组中指定值并返回它的索引(如果没有找到则返 ...

  2. PHP高性能开发-多进程开发

    硬件多核时代的软件业以前计算能力的提升一直在摩尔定律的指引下,沿着提升CPU时钟频率这条道路前进,从初期的几十MHz到如今的几GHz.但是,进入2002年以 来,CPU提升主频的困难越来越大,因为主频 ...

  3. 9.OpenStack安装web界面

    安装仪表板 安装仪表板组件 yum install -y openstack-dashboard httpd mod_wsgi memcached python-memcached 编辑/etc/op ...

  4. android的百度地图开发(二) 定位

    参考:http://blog.csdn.net/mr_wzc/article/details/51590485 第一步,初始化LocationClient类 //获取地图控件引用 mMapView = ...

  5. AC日记——可能的路径 51nod 1247

    可能的路径 思路: 看到题目想到gcd: 仔细一看是更相减损: 而gcd是更相减损的优化版: 所以,对于每组数据判断gcd是否相等就好: 来,上代码: #include <cstdio> ...

  6. CSS变量使用解析

    很早直接就了解到CSS变量相关的内容,奈何之前使用价值不高(很多主流浏览器不兼容) 最近发现主流浏览器都已经支持了这一变化 这一重要的变化,可能会让你发现,原生CSS从此变的异常强大~,下面看一下如何 ...

  7. CF987C Three displays【一维DP/类似最大子序列和】

    [链接]:CF987C [分析]:先求出每个s[i]后面比s[i]大的c[i]的最小值,然后枚举前两个数c(i),c(j)以及 j 后面递增且存在最小值的dp(j) [代码]: #include< ...

  8. 51nod 1091 线段的重叠【贪心/区间覆盖类】

    1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...

  9. 「kuangbin带你飞」专题十五 数位DP

    传送门 A.CodeForces - 55D Beautiful numbers 题意 一个正整数是 漂亮数 ,当且仅当它能够被自身的各非零数字整除.我们不必与之争辩,只需计算给定范围中有多少个漂亮数 ...

  10. HNOI2004 郁闷的出纳员(Splay)

    郁闷的出纳员 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的 ...