现在的位置: 首页 > 综合 > 正文

android数据存储:使用SQLite 开发简易心情日记

2018年02月16日 ⁄ 综合 ⁄ 共 10542字 ⁄ 字号 评论关闭

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>

 

 

任何程序都要理清思绪之后再编码,学习会更加有效率。

 

抱歉!评论已关闭.