热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

listview与SQLite结合实现记事本功能

这篇文章主要为大家详细介绍了listview与SQLite结合实现记事本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

android记事本的demo在网上一搜一大堆,但是大神写的demo往往功能太多导致新手难以着手,很难啃得动;而一些新手写的demo又往往是东拼西凑,代码很多都是copy的别人的,直接放在项目里面用,也不知道代码有什么作用。往往代码特别丑,重复性的代码也比较多。

笔者近期学到此处,自己理解之后也还是打算写个demo供新手学习一下。代码说不上优雅,但在笔者看来已经尽力去让人容易理解了。(源码在文章结尾)

为了便于新手学习,在此也是罗列一下涉及的知识点:
1、SQLite的基本使用,增删查改
2、listview,adapeter的基本使用
3、activity生命周期
4、intent、bundle传递参数
5、AlertDialog的基本使用

另外还有一些零碎知识点都可以百度到。

遇到的问题:

SQlite有个问题,就是主键不能够自动排序。比如说主键id为1 2 3 4,共4条记录。现在删除2 3,还剩下1 4记录,当再次插入时,id会变成5,而不是2.假设在初始4条记录的基础上,把这4条记录全都删掉,再次插入时,得到的id是5.
笔者在这点上也是花了比较久的时间,原本为了精简代码,想法是用listview中的arg2直接通过数据库记录的id进行操作,但是由于SQLite的这个问题,所以这种方法就有问题了。
最终,笔者采用的是内容搜索的方法,从listview的每个item中获取内容,然后到数据库中通过内容搜索该记录,最后对其进行操作。

效果: 

MainActivity:

import android.app.Activity; 
import android.app.AlertDialog.Builder; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
public class MainActivity extends Activity implements 
  OnItemClickListener, OnItemLongClickListener { 
 
 private ListView listview; 
 private SimpleAdapter simple_adapter; 
 private List> dataList; 
 private Button addNote; 
 private TextView tv_content; 
 private NoteDateBaseHelper DbHelper; 
 private SQLiteDatabase DB; 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
 
  InitView(); 
 } 
 
 //在activity显示的时候更新listview 
 @Override 
 protected void onStart() { 
  super.onStart(); 
  RefreshNotesList(); 
 } 
 
 
 private void InitView() { 
  tv_cOntent= (TextView) findViewById(R.id.tv_content); 
  listview = (ListView) findViewById(R.id.listview); 
  dataList = new ArrayList>(); 
  addNote = (Button) findViewById(R.id.btn_editnote); 
  DbHelper = new NoteDateBaseHelper(this); 
  DB = DbHelper.getReadableDatabase(); 
 
  listview.setOnItemClickListener(this); 
  listview.setOnItemLongClickListener(this); 
  addNote.setOnClickListener(new OnClickListener() { 
 
   @Override 
   public void onClick(View arg0) { 
    Intent intent = new Intent(MainActivity.this, noteEdit.class); 
    Bundle bundle = new Bundle(); 
    bundle.putString("info", ""); 
    bundle.putInt("enter_state", 0); 
    intent.putExtras(bundle); 
    startActivity(intent); 
   } 
  }); 
 } 
 
 
 //刷新listview 
 public void RefreshNotesList() { 
  //如果dataList已经有的内容,全部删掉 
  //并且更新simp_adapter 
  int size = dataList.size(); 
  if (size > 0) { 
   dataList.removeAll(dataList); 
   simple_adapter.notifyDataSetChanged(); 
  } 
 
  //从数据库读取信息 
  Cursor cursor = DB.query("note", null, null, null, null, null, null); 
  startManagingCursor(cursor); 
  while (cursor.moveToNext()) { 
   String name = cursor.getString(cursor.getColumnIndex("content")); 
   String date = cursor.getString(cursor.getColumnIndex("date")); 
   Map map = new HashMap(); 
   map.put("tv_content", name); 
   map.put("tv_date", date); 
   dataList.add(map); 
  } 
  simple_adapter = new SimpleAdapter(this, dataList, R.layout.item, 
    new String[]{"tv_content", "tv_date"}, new int[]{ 
    R.id.tv_content, R.id.tv_date}); 
  listview.setAdapter(simple_adapter); 
 } 
 
 
 
 // 点击listview中某一项的点击监听事件 
 @Override 
 public void onItemClick(AdapterView<&#63;> arg0, View arg1, int arg2, long arg3) { 
  //获取listview中此个item中的内容 
  String cOntent= listview.getItemAtPosition(arg2) + ""; 
  String content1 = content.substring(content.indexOf("=") + 1, 
    content.indexOf(",")); 
 
  Intent myIntent = new Intent(MainActivity.this, noteEdit.class); 
  Bundle bundle = new Bundle(); 
  bundle.putString("info", content1); 
  bundle.putInt("enter_state", 1); 
  myIntent.putExtras(bundle); 
  startActivity(myIntent); 
 
 } 
 
 // 点击listview中某一项长时间的点击事件 
 @Override 
 public boolean onItemLongClick(AdapterView<&#63;> arg0, View arg1, final int arg2, 
         long arg3) { 
  Builder builder = new Builder(this); 
  builder.setTitle("删除该日志"); 
  builder.setMessage("确认删除吗?"); 
  builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { 
   @Override 
   public void onClick(DialogInterface dialog, int which) { 
    //获取listview中此个item中的内容 
    //删除该行后刷新listview的内容 
    String cOntent= listview.getItemAtPosition(arg2) + ""; 
    String content1 = content.substring(content.indexOf("=") + 1, 
      content.indexOf(",")); 
    DB.delete("note", "cOntent= &#63;", new String[]{content1}); 
    RefreshNotesList(); 
   } 
  }); 
  builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 
   @Override 
   public void onClick(DialogInterface dialog, int which) { 
   } 
  }); 
  builder.create(); 
  builder.show(); 
  return true; 
 } 

NoteDateBaseHelper:

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
 
public class NoteDateBaseHelper extends SQLiteOpenHelper { 
 
 public static final String CreateNote = "create table note (" 
   + "id integer primary key autoincrement, " 
   + "content text , " 
   + "date text)"; 
 
 public NoteDateBaseHelper(Context context) { 
  super(context, "note", null, 1); 
 } 
 
 @Override 
 public void onCreate(SQLiteDatabase db) { 
  db.execSQL(CreateNote); 
 } 
 
 @Override 
 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
  // TODO Auto-generated method stub 
 
 } 
 
 
} 

noteEdit:

import android.app.Activity; 
import android.content.ContentValues; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import java.text.SimpleDateFormat; 
import java.util.Date; 
 
public class noteEdit extends Activity implements OnClickListener { 
 private TextView tv_date; 
 private EditText et_content; 
 private Button btn_ok; 
 private Button btn_cancel; 
 private NoteDateBaseHelper DBHelper; 
 public int enter_state = 0;//用来区分是新建一个note还是更改原来的note 
 public String last_content;//用来获取edittext内容 
 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.edit); 
 
  InitView(); 
 } 
 
 private void InitView() { 
  tv_date = (TextView) findViewById(R.id.tv_date); 
  et_cOntent= (EditText) findViewById(R.id.et_content); 
  btn_ok = (Button) findViewById(R.id.btn_ok); 
  btn_cancel = (Button) findViewById(R.id.btn_cancel); 
  DBHelper = new NoteDateBaseHelper(this); 
 
  //获取此时时刻时间 
  Date date = new Date(); 
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
  String dateString = sdf.format(date); 
  tv_date.setText(dateString); 
 
  //接收内容和id 
  Bundle myBundle = this.getIntent().getExtras(); 
  last_cOntent= myBundle.getString("info"); 
  enter_state = myBundle.getInt("enter_state"); 
  et_content.setText(last_content); 
 
  btn_cancel.setOnClickListener(this); 
  btn_ok.setOnClickListener(this); 
 } 
 
 @Override 
 public void onClick(View view) { 
  switch (view.getId()) { 
   case R.id.btn_ok: 
    SQLiteDatabase db = DBHelper.getReadableDatabase(); 
    // 获取edittext内容 
    String cOntent= et_content.getText().toString(); 
 
    // 添加一个新的日志 
    if (enter_state == 0) { 
     if (!content.equals("")) { 
      //获取此时时刻时间 
      Date date = new Date(); 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
      String dateString = sdf.format(date); 
 
      //向数据库添加信息 
      ContentValues values = new ContentValues(); 
      values.put("content", content); 
      values.put("date", dateString); 
      db.insert("note", null, values); 
      finish(); 
     } else { 
      Toast.makeText(noteEdit.this, "请输入你的内容!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
    // 查看并修改一个已有的日志 
    else { 
     ContentValues values = new ContentValues(); 
     values.put("content", content); 
     db.update("note", values, "cOntent= &#63;", new String[]{last_content}); 
     finish(); 
    } 
    break; 
   case R.id.btn_cancel: 
    finish(); 
    break; 
  } 
 } 
} 

activity_main:

 
 
  
 
  
 
   
   
  
 
 

edit:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
  
 
   
 
   
  
 
  
   
 
   
 
   
 
   

item:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
  
 
  
 
 

 最后附上源码:记事本

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
四川im__miki
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有