资讯详情

Android Studio开发本地备忘录:SQLite数据库实践

📅 2026/10/28 5:25:04 | 华诺云谱 👁 阅读
Android Studio开发本地备忘录:SQLite数据库实践
1. 项目概述基于Android Studio的本地备忘录开发这个纯安卓项目使用Android Studio作为开发环境实现了一个具备本地数据存储功能的记事本应用。核心功能包括创建、编辑、删除备忘录条目所有数据都通过SQLite数据库持久化保存在设备本地。作为入门级安卓开发练手项目它涵盖了基础UI设计、数据库操作和Activity生命周期管理等核心知识点。我在实际开发中发现这类备忘录应用虽然功能简单但能完整展示安卓开发的核心技术栈。特别适合刚学完Android基础的新手作为第一个综合性练习项目也适合需要快速实现本地数据存储的开发者参考。2. 核心功能设计与技术选型2.1 功能需求分析典型的备忘录应用需要支持以下基础功能新建备忘录包含标题和内容查看备忘录列表编辑已有备忘录删除单条或批量删除备忘录数据持久化存储进阶功能可以包括备忘录分类/标签搜索功能提醒设置数据备份/恢复2.2 技术方案选择为什么选择SQLiteSQLite是安卓平台内置的轻量级关系型数据库具有以下优势零配置无需单独安装整个数据库存储在单个文件中支持标准SQL语法性能优异适合移动设备原生支持无需额外依赖对比其他存储方案SharedPreferences适合存储简单键值对不适合结构化数据文件存储需要自行处理数据序列化和并发控制Room虽然更现代但增加了学习成本3. 项目实现详解3.1 开发环境准备Android Studio安装配置下载最新稳定版当前推荐2023.2.1确保安装时勾选Android SDK和必要的构建工具配置JDK建议JDK 17项目创建File - New - New Project - Empty Activity设置应用名称MyMemo包名com.example.mymemo语言Java/Kotlin本文以Java为例最低API级别建议API 26Android 8.03.2 数据库设计实现3.2.1 创建数据库帮助类public class MemoDbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME memo.db; private static final int DATABASE_VERSION 1; public MemoDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } Override public void onCreate(SQLiteDatabase db) { final String SQL_CREATE_MEMO_TABLE CREATE TABLE MemoContract.MemoEntry.TABLE_NAME ( MemoContract.MemoEntry._ID INTEGER PRIMARY KEY AUTOINCREMENT, MemoContract.MemoEntry.COLUMN_TITLE TEXT NOT NULL, MemoContract.MemoEntry.COLUMN_CONTENT TEXT, MemoContract.MemoEntry.COLUMN_CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP );; db.execSQL(SQL_CREATE_MEMO_TABLE); } Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(DROP TABLE IF EXISTS MemoContract.MemoEntry.TABLE_NAME); onCreate(db); } }3.2.2 定义Contract类public final class MemoContract { private MemoContract() {} public static class MemoEntry implements BaseColumns { public static final String TABLE_NAME memos; public static final String COLUMN_TITLE title; public static final String COLUMN_CONTENT content; public static final String COLUMN_CREATED_AT created_at; } }3.3 UI界面实现3.3.1 主界面布局activity_main.xmlLinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical androidx.recyclerview.widget.RecyclerView android:idid/rv_memos android:layout_widthmatch_parent android:layout_height0dp android:layout_weight1/ com.google.android.material.floatingactionbutton.FloatingActionButton android:idid/fab_add android:layout_widthwrap_content android:layout_heightwrap_content android:layout_gravityend|bottom android:layout_margin16dp android:srcdrawable/ic_add/ /LinearLayout3.3.2 备忘录项布局item_memo.xmlLinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightwrap_content android:orientationvertical android:padding16dp TextView android:idid/tv_title android:layout_widthmatch_parent android:layout_heightwrap_content android:textSize18sp android:textStylebold/ TextView android:idid/tv_content android:layout_widthmatch_parent android:layout_heightwrap_content android:layout_marginTop8dp android:maxLines2 android:ellipsizeend/ /LinearLayout3.4 功能逻辑实现3.4.1 主Activity核心代码public class MainActivity extends AppCompatActivity { private MemoAdapter mAdapter; private MemoDbHelper mDbHelper; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDbHelper new MemoDbHelper(this); RecyclerView recyclerView findViewById(R.id.rv_memos); recyclerView.setLayoutManager(new LinearLayoutManager(this)); mAdapter new MemoAdapter(this, getAllMemos()); recyclerView.setAdapter(mAdapter); FloatingActionButton fab findViewById(R.id.fab_add); fab.setOnClickListener(view - { Intent intent new Intent(MainActivity.this, EditorActivity.class); startActivity(intent); }); } private Cursor getAllMemos() { SQLiteDatabase db mDbHelper.getReadableDatabase(); return db.query( MemoContract.MemoEntry.TABLE_NAME, null, null, null, null, null, MemoContract.MemoEntry.COLUMN_CREATED_AT DESC ); } Override protected void onResume() { super.onResume(); mAdapter.swapCursor(getAllMemos()); } }3.4.2 数据库CRUD操作封装public class MemoDao { private final MemoDbHelper mDbHelper; public MemoDao(Context context) { mDbHelper new MemoDbHelper(context); } public long insertMemo(String title, String content) { SQLiteDatabase db mDbHelper.getWritableDatabase(); ContentValues values new ContentValues(); values.put(MemoContract.MemoEntry.COLUMN_TITLE, title); values.put(MemoContract.MemoEntry.COLUMN_CONTENT, content); return db.insert(MemoContract.MemoEntry.TABLE_NAME, null, values); } public int updateMemo(long id, String title, String content) { SQLiteDatabase db mDbHelper.getWritableDatabase(); ContentValues values new ContentValues(); values.put(MemoContract.MemoEntry.COLUMN_TITLE, title); values.put(MemoContract.MemoEntry.COLUMN_CONTENT, content); return db.update( MemoContract.MemoEntry.TABLE_NAME, values, MemoContract.MemoEntry._ID ?, new String[]{String.valueOf(id)} ); } public int deleteMemo(long id) { SQLiteDatabase db mDbHelper.getWritableDatabase(); return db.delete( MemoContract.MemoEntry.TABLE_NAME, MemoContract.MemoEntry._ID ?, new String[]{String.valueOf(id)} ); } }4. 性能优化与常见问题4.1 数据库操作优化使用事务批量操作SQLiteDatabase db mDbHelper.getWritableDatabase(); db.beginTransaction(); try { // 批量操作 db.setTransactionSuccessful(); } finally { db.endTransaction(); }避免在主线程执行耗时操作new Thread(() - { // 数据库操作 runOnUiThread(() - { // 更新UI }); }).start();4.2 常见问题排查数据库升级问题修改数据库结构时需要增加版本号并实现onUpgrade考虑使用ALTER TABLE而不是直接删除重建内存泄漏预防及时关闭Cursor和数据库连接在Activity生命周期方法中释放资源UI刷新不及时确保在数据变化后调用notifyDataSetChanged()考虑使用Loader或LiveData自动管理数据加载5. 项目扩展方向添加搜索功能实现SearchView使用SQL的LIKE语句进行模糊查询增加分类/标签功能新建分类表建立多对多关系表实现数据备份导出数据库文件到外部存储考虑JSON格式导出添加提醒功能使用AlarmManager设置提醒结合Notification显示提醒提示在实际开发中建议先实现基础功能再逐步添加扩展功能。每次迭代后都进行充分测试确保核心功能稳定。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑