Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3(版本号)支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,SQLite可以解析大部分标准SQL语句
SQLiteOpenHelper对数据库进行管理,提供了两个重要的方法,分别是
onCreate(SQLiteDatabase db):初次使用软件时生成数据库表,SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,若数据库不存在,Android系统会自动生成一个数据库,
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):升级软件时更新数据库表结构
功能实现:
使用android内部的数据库SQLite添加日记数据库并进行日记的增、删、改、查操作
使用Menu菜单弹出菜单项进行添加、删除操作
主页面实现一个淡入效果
效果演示:
i
点击Menu菜单时弹出两个菜单项
代码实现:
1:创建数据库帮助类DBHelper:
下面是png格式的不能够复制代码,望大家见谅,但是亲们可以看看过程,自己编写记忆更深。
2:编写实体类Diary
public class Diary { private int id; private String title;//日记标题 private String content;//内容 private String pubdate; public Diary(String title, String content) { super(); this.title = title; this.content = content; } public Diary(String title, String content, String pubdate) { super(); this.title = title; this.content = content; this.pubdate = pubdate; } getId,setId //显示日记列表时,标题长度限制
public String getSubTitle() {
if (title.length() > 8)
return title.substring(0, 7) + "……";
return title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
getContent,setContent,getPubdate,setPubdate方法 }
}
3:编写对数据库的操作类
在进行操作时可以使用SQLite内的封装的增删改查方法
此是源码,但是有字节颜色大小设置,遮盖了源码,不方便查看,后面png格式会看得清楚些
public class DiaryDao { private SQLiteDatabase sqLiteDatabase; private DBHelper dbHelper; // 构造方法,带有context参数,以便下一对象操作 public DiaryDao(Context context){ dbHelper=new DBHelper(context); } public void add(Diary diary) { String sql = "insert into td_diary(title,content,pubdate) values(?,?,?)"; // 得到SQLite数据库 sqLiteDatabase = dbHelper.getWritableDatabase(); // 执行sql语句 sqLiteDatabase.execSQL(sql,new String[] { diary.getTitle(), diary.getContent(), diary.getPubdate() }); } public void delete(int id) { String sql = "delete from td_diary where id=?"; // 得到SQLite数据库 sqLiteDatabase = dbHelper.getWritableDatabase(); // 执行sql语句 sqLiteDatabase.execSQL(sql, new String[] { Integer.toString(id) }); } public void update(Diary diary) { String sql = "update td_diary set title=?,content=? where id=?"; // 得到SQLite数据库 sqLiteDatabase = dbHelper.getWritableDatabase(); sqLiteDatabase.execSQL( sql, new String[] { diary.getTitle(), diary.getContent(), Integer.toString(diary.getId()) }); } public Diary select(int id) { Diary diary =null; String sql="select * from td_diary where id=?"; sqLiteDatabase=dbHelper.getReadableDatabase(); Cursor cursor=sqLiteDatabase.rawQuery(sql, new String[]{Integer.toString(id)}); if(cursor.moveToFirst()){ String title=cursor.getString(cursor.getColumnIndex("title")); String content=cursor.getString(cursor.getColumnIndex("content")); String pubdate=cursor.getString(cursor.getColumnIndex("pubdate")); diary = new Diary(title, content, pubdate); } return diary; } public List<Diary> getAllDiarys(){ List<Diary> list=new ArrayList<Diary>(); sqLiteDatabase=dbHelper.getReadableDatabase(); Cursor cursor=sqLiteDatabase.rawQuery("select * from td_diary", null); while(cursor.moveToNext()){ int id=cursor.getInt(cursor.getColumnIndex("id")); String title=cursor.getString(cursor.getColumnIndex("title")); String content=cursor.getString(cursor.getColumnIndex("content")); String pubdate=cursor.getString(cursor.getColumnIndex("pubdate")); Diary diary = new Diary(title, content, pubdate); diary.setId(id); list.add(diary); } return list; } }
下面的就是截取的代码图片格式,不能够复制代码,若有用可复制上面的代码:
增、删、改、查方法
sqLiteDatabase.insert/delete/update/query
查找所有信息时可以返回Cursor游标类型,给其绑定SimpleCursorAdapter就可获取值
即:填充列表时用键,及数据库的列名。
4:主页面的淡入效果,然后几秒钟调转日记列表页面
public class MainActivity extends Activity {
private ImageView image;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) this.findViewById(R.id.image);
image.setImageResource(R.drawable.tp);
AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);//alpha变化范围
animation.setDuration(3000);//显示时间
animation.setStartOffset(100);
image.setAnimation(animation);
// 新建一个handler实现演示跳转
new Handler().postDelayed(new Runnable() {
public void run() {
Intent i = new Intent(MainActivity.this, DiaryActivity.class);
startActivity(i);
}
}, 3000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
5:列表页面代码
public class DiaryActivity extends Activity { private ListView listview; private DiaryDao dao = new DiaryDao(this); List<Map<String, Object>> data; List<Diary> diarys; int POSITION = 0; int id=1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_diary); // 查找组件 listview = (ListView) this.findViewById(R.id.listView1); // 创建数据库操作实例类 data = new ArrayList<Map<String, Object>>(); diarys = new ArrayList<Diary>(); diarys = dao.getAllDiarys(); for (Diary d : diarys) { Map<String, Object> map = new HashMap<String, Object>(); map.put("title", d.getSubTitle()); map.put("pubdate", d.getPubdate()); data.add(map); } SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item_diary, new String[] { "title", "pubdate" }, new int[] { R.id.title, R.id.date }); //绑定适配器 listview.setAdapter(adapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { //点击列表项时跳转修改日志页面,将当前的日志信息传过去。 public void onItemClick(AdapterView<?> a, View v, int position, long l) { Diary diary = diarys.get(position); Intent intent = new Intent(DiaryActivity.this, DiaryUpdateActivity.class); intent.putExtra("id", diary.getId()); intent.putExtra("title", diary.getTitle()); intent.putExtra("content", diary.getContent()); startActivity(intent); } }); listview.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View v, int arg2, long arg3) { //从数据库获得选择的当前id号 //id = dao.getAllDiarys().get(arg2).getId(); id=(int) arg3;//直接获取id,内部封装好的arg3与数据库id一致 //在列表中位置 POSITION=arg2; } public void onNothingSelected(AdapterView<?> arg0) { } }); } // 菜单删除操作 private void delete() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle("请确认"); builder.setMessage("确定要删除第"+(POSITION+1)+"条记录吗?"); //点击确定按钮则删除当前的日志,刷新主页面,显示列表 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { System.out.println("删除的日志id是:"+id); dao.delete(id); Intent i = new Intent(); Intent in = new Intent(DiaryActivity.this, DiaryActivity.class); startActivity(in); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); builder.create().show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_diary, menu); menu.getItem(0).setIcon(android.R.drawable.ic_menu_add); menu.getItem(1).setIcon(android.R.drawable.ic_menu_delete); // 简单的菜单选择时设置监听 删除日志 /*menu.getItem(1).setOnMenuItemClickListener( new MenuItem.OnMenuItemClickListener() { //@Override public boolean onMenuItemClick(MenuItem item) { delete(); return false; } });*/ // 添加日志 /*menu.getItem(0).setOnMenuItemClickListener( new MenuItem.OnMenuItemClickListener() { //@Override public boolean onMenuItemClick(MenuItem item) { Intent in = new Intent(DiaryActivity.this, DiaryAddActivity.class); startActivity(in); return false; } });*/ return true; } //重写菜单选项被选择时调用方法 @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.delete: delete(); break; case R.id.add: Intent in = new Intent(DiaryActivity.this, DiaryAddActivity.class); startActivity(in); break; } return super.onOptionsItemSelected(item); } }
6:添加或更新日记布局代码
<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="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="标题" /> <EditText android:id="@+id/tit" android:inputType="text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="内容" /> <EditText android:id="@+id/cont" android:gravity="top" android:inputType="textMultiLine" android:minLines="4" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/add" android:layout_width="50dp" android:layout_height="40dp" android:text="添加"//保存 /> </LinearLayout>
主页面布局:
<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="match_parent" android:orientation="vertical" > <TextView android:text="心语日志" android:textSize="50dp" android:textColor="#1045ff" android:layout_gravity="center_horizontal" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <ImageView android:id="@+id/image" android:layout_height="fill_parent" android:layout_width="fill_parent" /> </LinearLayout>
7。更新日记java代码:
public class DiaryUpdateActivity extends Activity {
private EditText title;
private EditText content;
private Button save;
private DiaryDao dao;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.update_diary);
// 查找组件
title = (EditText) this.findViewById(R.id.edit1);
content = (EditText) this.findViewById(R.id.edit2);
save = (Button) this.findViewById(R.id.save);
// 获取上个视图传的参数值
Intent i = getIntent();
final int id = i.getIntExtra("id", 0);
System.out.println(id);
// 设置文本
title.setText(i.getStringExtra("title"));
content.setText(i.getStringExtra("content"));
// 添加事件点击处理监听
save.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Diary diary = new Diary( title.getText().toString(), content
.getText().toString());
diary.setId(id);
//执行更新
dao=new DiaryDao(DiaryUpdateActivity.this);
dao.update(diary);
//提示
Toast.makeText(DiaryUpdateActivity.this, "保存成功",
Toast.LENGTH_LONG).show();
//更新后跳转到日志列表视图
Intent in = new Intent(DiaryUpdateActivity.this,
DiaryActivity.class);
startActivity(in);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.update_diary, menu);
return true;
}
}
菜单布局代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group > <item android:id="@+id/add" android:title="添加新的日志" android:orderInCategory="100" /> <item android:id="@+id/delete" android:title="删除日志" android:orderInCategory="100" /> </group> </menu>
列表项的布局代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/title" android:textColor="#228B22" android:textSize="20dp" android:layout_width="wrap_content" android:layout_height="40dp" android:gravity="left" /> <TextView android:id="@+id/date" android:textColor="#340000" android:textSize="18dp" android:layout_width="fill_parent" android:layout_height="40dp" android:gravity="right" /> </LinearLayout>
任何程序都要理清思绪之后再编码,学习会更加有效率。