zoukankan      html  css  js  c++  java
  • 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();

            }

    表中数据的关联需要使用映射关系。所以我们创建两个实体classInfostuInfo。在这个例子中因为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

     


  • 相关阅读:
    4.2说说计算机中的异常
    1.1组合电路、时序电路在计算机课程中的地位
    EFM32JG系列MCU内部温度传感器使用方法
    +7虚拟内存的作用,通过什么方式提高虚拟内存的性能
    +6存储结构是怎样提高性能的,它和局部性的关系是什么。
    +5性能分析定律
    +4 高速缓存
    +3软件优化至关重要,软件优化一般有哪些方法?
    +2流水线是怎样提高性能的,会遇到什么问题,解决方法是什么
    +1阿姆达尔定律
  • 原文地址:https://www.cnblogs.com/qwop/p/6637333.html
Copyright © 2011-2022 走看看