Android数据存储-SQLite

         上次写了一篇关于怎么操作excel的文章,但是,其实我个人还是更倾向于使用数据库来存储数据的。所以我这里也写一篇我做的应用程序,也算是一个Demo吧。

       首先说这个的时候,要说几点注意的。第一,最好有点数据库的基础,不然看不懂我写的sql语句,虽然是最简单的语句;第二,这里面功能还不是很完善,所以,有很多限制要求,比方说,手动修改,这个就要严格按照我说的手动输入方式,不然修改会不成功,因为我是把输入的内容直接 写到sql语句中,所以有严格的要求。第三,我的主activity是参考别人的那个sqlitedemo做的,其实,也无非那几种,但是,绝对和别人的那个不同,特此申明,杜绝抄袭,尊重原创。

         

          好吧,说正题。这个程序,我实现的功能有以下几点。第一,增删改查这基本的肯定有;第二,程序实现的增删改查,就是固定写死在程序中,大部分是用我写的函数或者直接用sql语句来实现这写功能功能,主要弊端是,只能修改、查询、删除预定的写在程序里面的数据;第三,手动实现增删改查,就是用户可以输入想要的数据,然后存储。也可以输入要修改的新值,和修改或删除的条件去删除一些数据,这个的优点就是不用改程序就可以实现增删改查。

       下面说下技术细节。

        最基本的数据库的创建,因为我这里是在sdcard中创建的,所以要指明路径。创建一个数据库,我们一般来说都是用官方提供的help类实例化来做的,就是你先构造一个自己的类继承它的SQLiteOpenHelper类,然后用自己构造的这个类来实例化一个对象,然后就可以使用这个类的功能了。自己构造一个类继承就不说了,实例化也不用多说,主要是有了这个对象,怎么创建一个数据库,或者打开一个指定位置的数据库。

private File f = new File("/sdcard/dbfile/chz.db");
sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);

        这里要指出,这是在主activity里面创建的,当我在另一个activity里面要使用这个数据库的时候,其实也是这句话,因为这句话的含义是,打开一个指定路径下的数据库,如果不存在,就创建。

        好,我们说程序中的增删改查吧。这个最简单的方式就是这样。

String str=sql语句
sqlitedb.execSQL(str); 
       比方说如果是要查找的话,sql语句就是select * from test where id=1;这句就是把id=1的数据全部查找出来,还有很多,具体的你可以百度出sql语句。还有一种方式,就是你不想用这种语句,你非要用help类提供的方法来做的话,也是可以的。像我,就自己写了几个函数,调用它给的方法,然后实现自己要的功能,你们也可以写得出来。比方说我这里的插入,我写的函数,你们也参考下。
//插值
	public void insert(SQLiteDatabase sqlitedb,String id,String status,String name,String number){
		ContentValues cv = new ContentValues();  
        cv.put("id", id);  
        cv.put("status", status);  
        cv.put("name", name);  
        cv.put("number", number);  
        sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);	      
	}

        这里面有5个参数,第一个就是实例化创建的数据库,后面几个是我这里面做的程序需要用到的变量名,哦,我这是做一个收入和支出的账单数据库,所以status是支出还是收入,name是你的支出理由,比方说商品名活收入缘由,number就是金额咯。

       

//修改string
	public void edit(SQLiteDatabase sqlitedb,String text,String oldvalue,String newvalue){
		ContentValues cv = new ContentValues();  
        cv.put(text, newvalue);  
        sqlitedb.update(MySQLiteOpenHelper.TABLE_NAME, cv, text + "= '" +oldvalue+"'", null); 
	}
	
	//修改id
	public void edit(SQLiteDatabase sqlitedb,int id,String text,String value){
		ContentValues cv = new ContentValues();  
        cv.put(text, value);  
        sqlitedb.update(MySQLiteOpenHelper.TABLE_NAME, cv, "id" + "= " +Integer.toString(id), null); 
	}

         这是我随便写的两个修改函数,实现不同需求,第一个我想的是这样修改,就是知道以前的内容,我想换成别的内容;第二个修改是,我知道主key就是id的值,然后想修改这个id里面的某个内容的值。其实,你还有很多方式,你可以自己写函数,写自己想要的任何一个种方式。


        上面说的都是在程序里面就做好增删改查工作,这个是有局限性的,比方说,用户不可能修改程序去增加一条数据记录,所以没有应用价值,我们要能手动编辑输入修改删除和查询。这就要我们做一些工作了,其实也不是很多,我这里就增加了另外几个activity,一个是用来增加新数据的;一个是用来查询的;一个是集成了修改和删除于一体的activity(其实我偷懒,不想多划一个界面,就把修改的界面也当成是删除的用,嘻嘻)。

       首先说增加新数据,这个其实就是插入,我们要做的就是读取用户输入的id,status,name,number,然后把他们插入到刚才那个数据库里面,然后就可以了。


      从这个界面就可以看出来,很简单吧,主要是与几点要注意。这里有两个button,实现的功能不同,继续是要保留在这个activity里面,然后继续添加数据记录的,而确定是保存最后一次记录,然后退出这个activity,返回到主界面的。其次,这里面的edittext是要注意的,因为初始化时是null,所以,一定要放在button的监听事件里面读取edittext的值,不然读取到的都是null。但是,radiobutton正好相反,他自己有监听事件,也就是你选择的收入和支出,他是不能放在继续或确定那个button监听事件里面,他要单独出来,不然实现不了功能。这个的程序也很简单,我给代码,自己看吧,就是调运下我刚写的那个insert函数。

public class InsertActivity extends Activity {

	private String id;
	private String name;
	private String number;
	private String status = null;
	  
	private SQLiteDatabase sqlitedb;
	private File f = new File("/sdcard/dbfile/chz.db");  //数据库文件
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.insertactivity);
		
		sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
		
		//RadioGroup
		RadioGroup radiogroup = (RadioGroup)findViewById(R.id.radiogroup);
		radiogroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				// TODO Auto-generated method stub
				if(checkedId==R.id.radiobutton1)
				{
					Toast.makeText(InsertActivity.this,"receipt",Toast.LENGTH_SHORT).show();
					status = "receipt";
				}
				else if(checkedId==R.id.radiobutton2)
				{
					Toast.makeText(InsertActivity.this,"receipt",Toast.LENGTH_SHORT).show();
					status = "expenditure";
				}	
			}
		});
		
			
		
		//继续按键响应
		Button btn_goon = (Button)findViewById(R.id.button_goon);
		btn_goon.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				//EditText
				EditText edit_id = (EditText)findViewById(R.id.edit_insertid);
				id = edit_id.getText().toString();
				EditText edit_name = (EditText)findViewById(R.id.edit_insetname);
				name = edit_name.getText().toString();
				EditText edit_number = (EditText)findViewById(R.id.edit_insertnumber);
				number = edit_number.getText().toString();
				
				//int Id = Integer.parseInt(id);
				//double Number = Double.parseDouble(number); 
				insert(sqlitedb,id,status,name,number);
			}
		});

		//确定按键响应
				Button btn_sure = (Button)findViewById(R.id.button_sure);
				btn_sure.setOnClickListener(new OnClickListener(){

					@Override
					public void onClick(View arg0) {
						// TODO Auto-generated method stub
						//EditText
						EditText edit_id = (EditText)findViewById(R.id.edit_insertid);
						id = edit_id.getText().toString();
						EditText edit_name = (EditText)findViewById(R.id.edit_insetname);
						name = edit_name.getText().toString();
						EditText edit_number = (EditText)findViewById(R.id.edit_insertnumber);
						number = edit_number.getText().toString();
						
						//int Id = Integer.parseInt(id);
						//double Number = Double.parseDouble(number); 
						
						
						insert(sqlitedb,id,status,name,number);
						//sqlitedb.execSQL("DROP TABLE test");
						Intent intentinsert = new Intent();
						intentinsert.setClass(InsertActivity.this, MainActivity.class);
						startActivity(intentinsert);
						finish();
					}
				});
		
		
		
	}
	
	//插值
	public void insert(SQLiteDatabase sqlitedb,String id,String status,String name,String number){
		ContentValues cv = new ContentValues();  
        cv.put("id", id);  
        cv.put("status", status);  
        cv.put("name", name);  
        cv.put("number", number);  
        sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);	      
	}
		
}

        查询其实是和我上上次写的那个签到的程序一样,就是一个listview读取数据库,然后显示在一个activity里面,这里就不说了,不知道的,看我的前前一篇文章,关于签到程序的。我这里直接贴图吧。

         其实看懂了上面的增加数据,修改数据就更简单了。我的界面设计特意简单化了,因为复杂的,可以把上面的界面重新设计一遍,然后读取每个修改前和修改后值,很麻烦,我这里直接就让用户按照我的格式输入条件和修改值,这样就简单多了,写得代码也很简单明了,直接调运sql语句就可以了。

public class EditActivity extends Activity {
	  
	private SQLiteDatabase sqlitedb;
	private File f = new File("/sdcard/dbfile/chz.db");  //数据库文件
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.editactivity);
		
		sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
		
		Button btn_sure = (Button)findViewById(R.id.button_queding);
		btn_sure.setOnClickListener(new Button.OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				//EditText
				EditText edit_condition = (EditText)findViewById(R.id.edit_condition);
				String condition = edit_condition.getText().toString();
				EditText edit_value = (EditText)findViewById(R.id.edit_newvalue);
				String value = edit_value.getText().toString();
				

				String UPDATA_DATA =
						"UPDATE "+ MySQLiteOpenHelper.TABLE_NAME + " SET " + value + " WHERE " + condition ;       
	            sqlitedb.execSQL(UPDATA_DATA); 
				
	            Intent intent = new Intent();
				intent.setClass(EditActivity.this, MainActivity.class);
				startActivity(intent);
				finish();
				
			}});
		
		Button btn_delete = (Button)findViewById(R.id.button_delete);
		btn_delete.setOnClickListener(new Button.OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				EditText edit_condition = (EditText)findViewById(R.id.edit_condition);
				String condition = edit_condition.getText().toString();
				
				String DELETE_DATA =
						"DELETE FROM  "+ MySQLiteOpenHelper.TABLE_NAME + " WHERE " + condition ;       
	            sqlitedb.execSQL(DELETE_DATA);
	            
	            Intent intent = new Intent();
				intent.setClass(EditActivity.this, MainActivity.class);
				startActivity(intent);
				finish();
			}});
		
	}
      比方说我要修改name=hp的那一条记录,把status改成chz,就要按照我这幅图来操作。

         这里输入的格式是有要求的,因为我的程序是直接用sql语句,所以,这个就字符串的修改和查找,都是要加单引号的,但是id可以不用。修改后的值,我们再查询显示一次,看是不是变化了。

         的确变化了,hp的前面有了chz,其实你还可以修改id的,我直接把这条都修改掉,尤其是id的值。直接贴图 就可以了。

        这时我就把这条的id改成了8,同时也利用id=8,把别的都修改了。

      细心的同学也看到了,我这个确定下面还有一个Delete键,没错,这个界面也是删除键跳转到的activity,但是实现的功能不同,但是都利用了这个修改条件这个edittext,不过这次是把满足这个条件的记录删除掉。比方说我们要删除刚才那条shopping记录,我们就可以这样。

 

      不同的是这次不用写下面的修改值,而且是使用delete这个button。效果就是你再次查询,就没有刚才的那个值了。

       我们看不到刚才那条shopping记录了。

       大体上就是这么多,我看看哈。哦,忘记说主activity了,其实这个是最简单的,就是设置几个button,然后点击了,就跳转到相应的activity里就可以了。代码就不用了,界面图还是给一张吧,不要说我有抄袭嫌疑哦,我是修改过的,最主要的是,我不是主界面是主要部分,我的精髓是用户可以自己修改,而不是程序猿自己修改的测试demo!

      

         哦,这里还有几个我写这个程序的时候遇到的问题,以后有空再回头来学习。第一个就是,是否可以直接把插入的那个activity里面的值传给主activity,而不是在插值那个activity里面实现数据库的修改,我知道这个可以用intent和bundle来传值,但是我写得时候,没有实现这个功能。第二个就是,是否可以用broadcast receiver来传值,这个我也没有实现。(看来基础不好呀)第三个就是手机分辨率的问题,这个我是用note2的5.5寸屏写的,因为项目以后都是这个手机,现在在习惯这款手机,但是,其实我用的是小米手机,这个不能移植到我手机,很痛苦,我要考虑移植问题。

         哦,对了,发现这款傻博推荐的软件不错,也推荐给大家吧。叫做Genymotion。比较快,比自带的模拟器好用。



    




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值