增删查改的实现
创建主活动及布局文件
- 主活动是整个app的入口,还原一下用户的使用场景:
点击新增按钮:进入AddContent活动
点击备忘录列表上的某个Item:进入对应的备忘录的查看界面
布局文件中应该有一个新建备忘录的Button和一个显示备忘录列表的ListView。
在MainActivity中创建对象根据id获取到上述布局实体并添加逻辑。
对Button设置点击监听事件并重写点击方法(跳转到新增备忘录的活动):
newbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, AddContent.class); startActivity(i); } );
对ListView绑定ListViewAdapter用于绘制ListView的每一个Item中的显示内容;另外为ListView的Item设置点击监听事件并重写点击方法(跳转到查看备忘录的活动):
lv.setOnItemClickListener(this); @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { cursor = dbReader.query(NotesDB.TABLE_NAME, null, null, null, null, null, null); cursor.moveToPosition(position); Intent j = new Intent(MainActivity.this,ShowContent.class); j.putExtra(NotesDB.ID, cursor.getInt(cursor.getColumnIndex(NotesDB.ID))); j.putExtra(NotesDB.CONTENT, cursor.getString(cursor.getColumnIndex(NotesDB.CONTENT))); j.putExtra(NotesDB.TIME, cursor.getString(cursor.getColumnIndex(NotesDB.TIME))); startActivity(j); }
创建数据库
重写了两个方法,分别是创建数据库和更新数据库。
其中onUpgrade()方法确保app在覆盖安装时不会覆盖原有的数据库。
@Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + ID +" INTEGER PRIMARY KEY AUTOINCREMENT," + CONTENT + " TEXT NOT NULL," + TIME + " TEXT NOT NULL)");//最后的括号不能忘 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
创建添加备忘的活动及布局文件
用户的使用场景:
进入AddContent活动输入文字
点击取消按钮:返回MainActivity界面
点击保存按钮:输入的文字和当前日期时间被存入数据库布局包括一个输入文字的EditText和两个Button分别用于保存和取消。
- 在活动中为两个按钮设置点击监听事件重写点击方法:
- 取消按钮:finish()当前活动;需要注意的是,要想返回的活动是主界面必须在Manifest文件中为主活动添加
android:launchMode="singleTask"
的声明。 - 保存按钮:将EditText中的文字和当前时间用ContentValue对象存入数据库;注意获取当前时间用SimpleDateFormat的format方法来得到Date对象的合适的格式,返回值类型为String。
- 取消按钮:finish()当前活动;需要注意的是,要想返回的活动是主界面必须在Manifest文件中为主活动添加
ContentValue和数据库的写入方法如下:
public void addDB() { ContentValues cv = new ContentValues(); cv.put(NotesDB.CONTENT,edtext.getText().toString()); cv.put(NotesDB.TIME, getTime()); dbWriter.insert(NotesDB.TABLE_NAME, null, cv); } private String getTime() { SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date date = new Date(); String str = format.format(date); return str; }
创建查看备忘的活动及布局文件
- 用户的使用场景:
1 | 进入ShowContent活动查看备忘录详细内容(包括存在数据库中的时间) |
- 布局包括一个用来显示文字的EditText和两个Button分别用于返回和删除。
- 活动中两个按钮的点击监听事件:
- 返回按钮同新增活动中的取消按钮
- 删除按钮的
onClick
方法中的删除数据库记录的代码如下:
1 | public void deleteData() { |
- 活动中的EditText是用来显示备忘内容的因此将编辑属性关闭,备忘内容从启动该活动的Intent中获取。
1 | s_edtxt.setText(this.getIntent().getStringExtra(NotesDB.CONTENT)); |
创建修改备忘的活动及布局文件
- 用户的使用场景:
1 | 进入UpdateContent活动修改备忘录详细内容(同时更新存在数据库中的时间) |
- 布局包括EditText和两个Button
+活动中为两个按钮设置点击监听事件:- 返回按钮同新增活动中的取消按钮
- 保存按钮同新增按钮中的保存按钮
- 活动中的EditText除了要显示原有的备忘内容外,还要有可以编辑的属性:
1 | u_edtxt.setText(this.getIntent().getStringExtra(NotesDB.CONTENT)); |
在Manifest文件中注册活动:
1 | <application |
- 至此,备忘录的增删改查功能已经添加完毕。
云端同步功能实现
同步功能概述
备忘录的云端同步可以让用户在多个设备间同步数据,并提供数据备份功能。实现云同步需要考虑以下几个方面:
- 数据存储方案
- 用户认证
- 同步策略
- 冲突处理
推荐的技术方案
1. 后端存储选择
- LeanCloud (推荐)
- 提供开箱即用的数据存储
- 内置用户系统
- 有完整的Android SDK
- 免费额度足够个人开发者使用
- Firebase (替代方案)
- Google官方支持
- 实时数据同步
- 较完善的离线支持
2. 数据表设计
1 | Note { |
实现步骤 (TodoList)
1. 基础配置
- [ ] 注册LeanCloud账号并创建应用
- [ ] 添加LeanCloud SDK依赖
- [ ] 在Application中初始化SDK
- [ ] 配置AndroidManifest添加所需权限
2. 用户系统
- [ ] 实现注册界面
- [ ] 实现登录界面
- [ ] 实现用户信息存储
- [ ] 添加登出功能
3. 数据同步
- [ ] 修改本地数据库结构,增加同步相关字段
- [ ] 实现数据上传功能
- [ ] 实现数据下载功能
- [ ] 添加定时同步服务
4. 冲突处理
- [ ] 实现版本控制
- [ ] 添加冲突检测逻辑
- [ ] 实现冲突解决策略
5. 离线支持
- [ ] 实现本地缓存
- [ ] 添加离线操作队列
- [ ] 网络恢复后自动同步
代码示例
LeanCloud初始化
1 | public class MyApplication extends Application { |
数据同步示例
1 | public class SyncService { |
注意事项
- 数据安全
- 设置适当的ACL权限
- 敏感数据加密存储
- 使用HTTPS传输
- 性能优化
- 批量同步而不是单条同步
- 合理设置同步频率
- 压缩数据包大小
- 用户体验
- 同步状态提示
- 网络异常处理
- 后台静默同步
- 耗电优化
- 使用WorkManager调度同步任务
- 根据网络状态调整同步策略
- 避免频繁同步
后续优化方向
- 支持多设备同步
- 添加同步历史记录
- 实现数据版本回滚
- 添加同步设置选项
- 支持选择性同步
参考文档: