感谢群里素不相识的好心人的帮助,我的基础不好,但是一直帮我到很晚,真心的感谢,祝身体安康。
这里主要实现了根据用户输入的信息显示在listView上,比较不容易想到的就是用户信息表并没有job的信息post,只有jid,而想得到post就得连接另外一张表,而写出查询语句后,问题就转移到了该怎么存储查询到的内容。之前一直考虑的是往person类里面存,但是这样是不行的,思路被限制死了。改用obj数组.
DBHelper.java
package com.example.emotional.util; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "emotional.db"; private static final int DATABASE_VERSION = 1; public DBHelper(Context context) { //CursorFactory设置为null,使用默认值 super(context, DATABASE_NAME, null, DATABASE_VERSION); } //数据库第一次被创建时onCreate会被调用 @Override public void onCreate(SQLiteDatabase db) { // db.execSQL("drop table personalinfo"); // db.execSQL("CREATE TABLE IF NOT EXISTS person" +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, " + // "uid INTEGER, year INTEGER,month INTEGER,day INTEGER,job INTEGER,sex INTEGER)"); //建立个人信息表 db.execSQL("create table if not exists person (_id integer primary key autoincrement,name varhcar,uid varchar,year integer,month integer,day integer,jid integer,sex integer);"); //建立职业信息表 // db.execSQL("CREATE TABLE IF NOT EXISTS job" +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +"jid INTEGER, post VARCHAR)"); db.execSQL("create table if not exists job (_id integer primary key autoincrement,jid integer,post varchar);"); //为职业信息表插入数据 db.execSQL("insert into job values (null,1001,'体力劳动者');"); db.execSQL("insert into job values (null,1002,'脑力劳动者');"); db.execSQL("insert into job values (null,1003,'既是体力劳动者也是脑力劳动者');"); db.execSQL("insert into job values (null,1004,'既不是体力劳动者也不是脑力劳动者');"); //建立配置信息表 // db.execSQL("CREATE TABLE IF NOT EXISTS configuration" +"(_id INTEGER PRIMARY KEY AUTOINCREMENT , " +"joinWeb INTEGER,sharePosition INTEGER)"); db.execSQL("create table if not exists configuration (_id integer primary key autoincrement,joinWeb integer,sharePosition integer);"); db.execSQL("insert into configuration values(null,0,0);");//默认插入数据不加入网络,不进行地理位置共享 //建立建议表 // db.execSQL("CREATE TABLE IF NOT EXISTS suggestion" +"(_id INTEGER PRIMARY KEY AUTOINCREMENT , " +"jid INTEGER , condition VARCHAR,suggest TEXT)"); db.execSQL("create table if not exists suggestion (_id integer primary key autoincrement,jid integer,condition varchar,suggest text)"); } //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE person ADD COLUMN other STRING"); } }
DBManager.java
package com.example.emotional.util; import java.util.ArrayList; import java.util.List; import com.example.emotional.pojo.Person; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class DBManager { private DBHelper helper; private SQLiteDatabase db; public DBManager(Context context) { helper = new DBHelper(context); // 因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, // mFactory); // 所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里 db = helper.getWritableDatabase(); } /** * add persons * * @param persons */ public void add(List<Person> persons) { db.beginTransaction(); // 开始事务 try { for (Person person : persons) { db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?,?,?,?,?)", new Object[] { person.name, person.uid, person.year,person.month,person.day,person.jid,person.sex}); } db.setTransactionSuccessful(); // 设置事务成功完成 } finally { db.endTransaction(); // 结束事务 } } /** * update person's age * * @param person */ // public void updateAge(Person person) // { // ContentValues cv = new ContentValues(); // cv.put("age", person.age); // db.update("person", cv, "name = ?", new String[] { person.name }); // } /** * delete old person * * @param person */ // public void deleteOldPerson(Person person) // { // db.delete("person", "age >= ?", // new String[] { String.valueOf(person.age) }); // } /** * query all persons, return list * * @return List<Person> */ // public List<Person> query() // { // ArrayList<Person> persons = new ArrayList<Person>(); // Cursor c = queryTheCursor(); // while (c.moveToNext()) // { // Person person = new Person(); // person._id = c.getInt(c.getColumnIndex("")); // person.uid = c.getString(c.getColumnIndex("uid")); // person.name = c.getString(c.getColumnIndex("name")); // person.year = c.getInt(c.getColumnIndex("year")); // person.month = c.getInt(c.getColumnIndex("month")); // person.day= c.getInt(c.getColumnIndex("day")); // person.jid= c.getInt(c.getColumnIndex("jid")); // person.sex= c.getInt(c.getColumnIndex("sex")); // // persons.add(person); // } // c.close(); // return persons; // } public List<Object[]> query(){ ArrayList<Object[]> objs = new ArrayList<Object[]>(); Cursor c = queryTheCursor(); while (c.moveToNext()){ Object[] obj = new Object[]{c.getString(c.getColumnIndex("name")), c.getInt(c.getColumnIndex("year")), c.getInt(c.getColumnIndex("month")), c.getInt(c.getColumnIndex("day")), c.getString(c.getColumnIndex("post")), c.getInt(c.getColumnIndex("sex"))}; objs.add(obj); } c.close(); return objs; } /** * query all persons, return cursor * * @return Cursor */ public Cursor queryTheCursor() { //Cursor c = db.rawQuery("SELECT * FROM person", null); Cursor c = db.rawQuery("select name,uid,year,month,day,sex,post from person p join job j on p.jid=j.jid",null); return c; } /** * close database */ public void closeDB() { db.close(); } }
Person.java
package com.example.emotional.pojo; public class Person { public int _id; public int year; public int month; public int day; public int jid; public String uid; public String name; public int sex; public Person() { } public Person(String name,String uid,int year, int month, int day, int jid, int sex) { this.year = year; this.month = month; this.day = day; this.jid = jid; this.name = name; this.sex = sex; this.uid = uid; } }
ShowPersonInfoListActivity.java
package com.example.emotional.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.example.emotional.R; import com.example.emotional.R.layout; import com.example.emotional.R.menu; import com.example.emotional.pojo.Person; import com.example.emotional.util.DBManager; import android.R.integer; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ListView; import android.widget.SimpleAdapter; public class ShowPersonInfoListActivity extends Activity { private DBManager mDbManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_person_info_list); mDbManager = new DBManager(this); ListView listView = (ListView) findViewById(R.id.personalInfoShowListView); List<Object[]> objects = mDbManager.query();//取得全部对象 List<HashMap<String, String>> listData = new ArrayList<HashMap<String,String>>(); for (Object[] obj:objects) { HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("name",(String)obj[0]); // hashMap.put("year",String.valueOf(obj[1])); // hashMap.put("month",String.valueOf(obj[2])); // hashMap.put("day",String.valueOf(obj[3])); // hashMap.put("post",(String)obj[4]); if (1 == (Integer)obj[5] ) { hashMap.put("sex","性别男 "+obj[1]+"年"+obj[2]+"月"+obj[3]+"出生,职业为 "+obj[4]); }else { hashMap.put("sex","性别女 "+obj[1]+"年"+obj[2]+"月"+obj[3]+"出生,职业为 "+obj[4]); } listData.add(hashMap); } // for (Person person: persons) // { // HashMap<String, String> hashMap = new HashMap<String, String>(); // hashMap.put("name", person.name); // hashMap.put("sex", person.year+"年"+person.month+"月"+person.day+"日出生," +"性别 "+person.sex+"职业为"+person.jid); // listData.add(hashMap); // // } SimpleAdapter adapter = new SimpleAdapter(this, listData,android.R.layout.simple_list_item_2,new String[]{"name", "sex"}, new int[]{android.R.id.text1, android.R.id.text2}); listView.setAdapter(adapter); } }
activity_show_person_info_list.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/personalInfoShowListView" /> </LinearLayout>
PersionalInfoActivity.java
package com.example.emotional.activity; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.UUID; import com.example.emotional.R; import com.example.emotional.pojo.Person; import com.example.emotional.util.DBManager; import android.R.integer; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; import android.widget.DatePicker.OnDateChangedListener; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Spinner; import android.widget.Toast; /** * 这个类专属于个人信息页面,存在以下控件 button:取消、保存 editText:姓名 radioButton:男、女 datepicker * spinner 使用xml作为数据源 * * */ public class PersionalInfoActivity extends Activity { private Button btnCancel;// 取消按钮 private Button btnSave;// 保存按钮 private EditText etName;// 姓名输入框 private RadioGroup radioGroup;// 性别单选按钮组 private DatePicker mDatePicker;// 日期选择器 private Spinner spinner;// 职业选择下拉框 private ArrayAdapter adapter;// 下拉框填充器 private RadioButton radioButton;//单选按钮 private DBManager mDBManager; private String uuid; int radioButtonId; int year,month,day; long userLife; int userYear,userMonth,userDay; int sex; String userName; String userGender; String userJob; String birth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_persional_info); btnCancel = (Button) findViewById(R.id.personalinfo_title_cancle_button); btnSave = (Button) findViewById(R.id.personalinfo_title_save_button); etName = (EditText) findViewById(R.id.personalinfo_body_name_editText); mDatePicker = (DatePicker) findViewById(R.id.personalinfo_body_birthday); spinner = (Spinner) findViewById(R.id.personalinfo_body_job_Spinner); mDBManager = new DBManager(this);//初始化DBManager uuid = UUID.randomUUID().toString();//生成唯一标识 // 为按钮设置监听器 btnCancel.setOnClickListener(new PersionalInfoOnClickListener()); btnSave.setOnClickListener(new PersionalInfoOnClickListener()); /*************** 获取性别 **********************/ radioGroup = (RadioGroup) findViewById(R.id.personalinfo_body_gender_radioGroup); radioButton = (RadioButton) findViewById(R.id.male); radioButton.setChecked(true);//使性别男选中,避免空指针 /****************** datePicker **********************/ // 获取用户输入的年月日 Calendar calendar = Calendar.getInstance(); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH); day = calendar.get(Calendar.DAY_OF_MONTH); userYear = year; userMonth = month+1; userDay = day; System.out.println("=====在init方法外 datepicker未改变时候=======userYear="+userYear+" userMonth="+userMonth+" userDay"+userDay); mDatePicker.init(year, month, day, new OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { System.out.println("=====在init方法中=======year="+year+" monthOfYear="+monthOfYear+" dayOfMonth"+dayOfMonth); System.out.println("====在init方法中====年月日1"+year+"-"+(monthOfYear+1)+"-"+dayOfMonth); birth = year+"-"+(monthOfYear+1)+"-"+dayOfMonth; System.out.println("====在init方法中====年月日2"+birth); System.out.println("===在init方法中==活了的天数"+getUserLife(year, monthOfYear, dayOfMonth)); userYear = year; userMonth = monthOfYear+1; userDay = dayOfMonth; System.out.println("=====在init方法中=======userYear="+userYear+" userMonth="+userMonth+" userDay"+userDay); } }); /***************** 下拉列表获取职业 ********************/ // 将可选内容与ArrayAdapter连接起来 adapter = ArrayAdapter.createFromResource(this, R.array.jobs,android.R.layout.simple_spinner_item); // 设置下拉列表的风格 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 将adapter添加到spinner中 spinner.setAdapter(adapter); // 添加事件Spinner事件监听 spinner.setOnItemSelectedListener(new SpinnerXMLSelectedListener()); // 设置默认值 spinner.setVisibility(View.VISIBLE); }// OnCreate()结束 /*************** 内部类 为2个按钮提供监听器内容 **********************/ class PersionalInfoOnClickListener implements OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.personalinfo_title_cancle_button:// 如果点选取消按钮 // 重置各空间内容 姓名 性别 时间 spinner etName.setText("");//设置姓名输入为空 //重置性别选项 radioButton = (RadioButton) findViewById(R.id.male); radioButton.setChecked(true); //重置日期选择 mDatePicker.init(year, month, day, new OnDateChangedListener(){ @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { birth = year+"-"+(monthOfYear+1)+"-"+dayOfMonth; userYear = year; userMonth = monthOfYear+1; userDay = dayOfMonth; } }); //重置job Spinner spinner.setAdapter(adapter); break; case R.id.personalinfo_title_save_button:// 如果点选保存按钮 if (TextUtils.isEmpty(etName.getText())) { Toast.makeText(PersionalInfoActivity.this,"姓名不能为空", Toast.LENGTH_SHORT).show(); }else { /************持久化性别**************/ // 获取变更后的选中项ID radioButtonId = radioGroup.getCheckedRadioButtonId(); // 根据ID获取radioButton的实例 radioButton = (RadioButton) PersionalInfoActivity.this.findViewById(radioButtonId); // 取得性别 userGender = radioButton.getText().toString(); //userJob可以直接用 userName = etName.getText().toString().trim(); System.out.println("=======持久化======活了的天数为" +userLife); System.out.println("==========持久化===========职业" + userJob);// ==============================================测试 // 将数据放入SQLlite ArrayList<Person> persons = new ArrayList<Person>(); if ("男".equals(userGender)) { sex = 1; }else { sex = 2; } System.out.println("========即将存入数据库的userYear="+userYear+" userMonth="+userMonth+" userDay="+userDay); // Person person = new Person(userName,123456, userYear,userMonth,userDay,uuid,sex); Person person = new Person(userName, uuid, userYear, userMonth, userDay, 1003, sex); persons.add(person); mDBManager.add(persons); Toast.makeText(PersionalInfoActivity.this, "数据储存成功", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(); intent.setClass(PersionalInfoActivity.this, ShowPersonInfoListActivity.class); startActivity(intent); } break; } } } /*************** 内部类 为下拉列表提供选择监听器 **********************/ // 使用XML形式操作 class SpinnerXMLSelectedListener implements OnItemSelectedListener { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { userJob = adapter.getItem(arg2).toString(); System.out.println("============在下拉列表监听器中==========职业是" + userJob); } public void onNothingSelected(AdapterView<?> arg0) { } } /*************** 抽取出来的 计算年龄长度的方法 **********************/ public long getUserLife(int year,int monthOfYear,int dayOfMonth) { Calendar birthCalendar = new GregorianCalendar(); birthCalendar.set(year, monthOfYear, dayOfMonth);//格利高里历法以0为第一个月,因此: 格利高里月+1 = 实际月份,反之: 格利高里月 = 实际月份-1 Date date = new Date(); date = birthCalendar.getTime(); long time = date.getTime();//合并的话就是 long time = birth.getTime().getTime(); long betTime = System.currentTimeMillis() - time; userLife = betTime/(24*3600*1000); // System.out.println("======活了的天数"+userLife); return userLife; } /*****在 activity关闭时 关闭数据库*****/ @Override protected void onDestroy() { super.onDestroy(); mDBManager.closeDB(); } }