android-SQLite数据库MVC关联实例源码(三层架构)

来源:互联网 发布:知乎 app 编辑:程序博客网 时间:2024/05/16 10:46

前两天布置下了一个期末练习,其中的重点是两个表之间的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

 


13 0