前两天布置下了一个期末练习,其中的重点是两个表之间的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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端