第一行代码笔记3:数据存储

三种存储方式:文件、SharedPreference、数据库。

一、文件存储

不对存储内容进行任何格式化处理,所有数据都是原封不动保存到文件中,比较适于存储简单的文本数据或二进制数据。

1、将数据存储到文件中

contextopenFileOutput()返回FileOutputStream对象。再构建一个OutputStreamWriter对象,接着使用OutputStreamWriter构建一个BufferedWriter对象。然后调用write()就行了,最后记得关闭BufferedWriter

public void save(String inputText) {
	FileOutputStream out = null;
	BufferedWriter writer = null;
	try {
		out = openFileOutput("data", Context.MODE_PRIVATE);
		writer = new BufferedWriter(new OutputStreamWriter(out));
		writer.write(inputText);
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			if (writer != null) {
				writer.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2、从文件中读取数据

context还提供了一个openFileInput(),用于从文件中读取数据,返回一个FileInputStream对象。用FileInputStream构建一个InputStreamReader对象,再用InputStreamReader构建一个BufferedReader对象,读取数据,读取完成记得关闭BufferedReader

public String load() {
	FileInputStream in = null;
	BufferedReader reader = null;
	StringBuilder content = new StringBuilder();
	try {
		in = openFileInput("data");
		reader = new BufferedReader(new InputStreamReader(in));
		String line = "";
		while ((line = reader.readLine()) != null) {
			content.append(line);
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (reader != null) {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	return content.toString();
}

二、SQLite数据库
1、创建数据库

SQLiteOpenHelper可以方便的对数据库进行创建和升级。

getReadableDatabase()getWritableDatabase()都可以创建或打开一个现有的数据库(若数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()返回的对象将以只读的方式去打开数据库,而getWritableDatabase()则将出现异常。

public class MyDatabaseHelper extends SQLiteOpenHelper {

	public static final String CREATE_BOOK = "create table Book("
			+ "id integer primary key autoincrement, "
			+ "author text, "
			+"price real, "
			+ "pages integer, "
			+ "name text)";
	
	public static final String CREATE_CATEGART = "create table Category("
			+ "id integer primary key autoincrement, "
			+ "catetory_name text, "
			+ "category_code integer)";
	
	private Context mContext;
	
	public MyDatabaseHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		mContext = context;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);
		db.execSQL(CREATE_CATEGART);
		Toast.makeText(mContext, "create succeeded", Toast.LENGTH_LONG).show();
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("drop table if exists Book");
		db.execSQL("drop table if exists Category");
		onCreate(db);
	}
}

public class MainActivity extends BaseActivity {

	private MyDatabaseHelper dbHelper;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
<span style="white-space:pre">		</span><span style="color:#ff0000;">//第二个参数是数据库名;第三个参数允许我们在查询数据时返回一个自定义的Cursor,一般传入null;第四个参数表示当前数据库的版本号</span>
		dbHelper = new MyDatabaseHelper(MainActivity.this, "BookStore.db", null, 1);

		Button btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				dbHelper.getWritableDatabase();
			}
		});
	}
}
2、升级数据库

当数据库已经存在时,再创建新表是不会创建成功的。解决方法:在onUpgrade()中先将两张表删除,再调用onCreate()重新创建。因为创建表时如果发现这张表已经存在,就会直接报错。最后想办法让onUpdate()能够执行,创建数据库时传入的版本号,只要传入一个比之前版本号大的数,就可让onUpdate()执行了。代码见上。

3、添加数据

对数据的操作无非四种,即CUIDCreateRetrieveUpdateDelete

SQLiteDatabase提供了一个inset(),专门用于添加数据。第一个参数是表名,第二个参数用于在未指定数据的情况下给某些可为空的列自动赋值NULL,一般用不到,直接传入null即可,第三个参数是一个ContentValues对象,它提供了一系列的put()重载。

btn.setOnClickListener(new OnClickListener() {

	@Override
	public void onClick(View v) {
		/*Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
		sendBroadcast(intent);*/
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name", "The Da Vinci Code");
		values.put("author", "mwj");
		db.insert("Book", null, values);
		values.clear();
		
		values.put("name", "The Lost Symbol");
		values.put("author", "wyx");
		db.insert("Book", null, values);
	}
});
4、更新数据

update()第一个参数是表名;第二个参数是ContentValues对象;第三、四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。

SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The DaVinci Code" });

第三个参数对应SQL的where部分,表示去更新所有name等于?的行,而?代表一个占位符,可通过第四个参数指定占位符的实际内容。因此上述代码想表达的是:将名字是The Da Vinci Code的这本书价格改成10.99。

5、删除数据

delete()第一个参数是表名,第二和三个参数用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。

deleteButton.setOnClickListener(new OnClickListener() {
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void onClick(View v) {
<span style="white-space:pre">		</span>SQLiteDatabase db = dbHelper.getWritableDatabase();
<span style="white-space:pre">		</span>db.delete("Book", "pages > ?", new String[] { "500" });
<span style="white-space:pre">	</span>}
});

6、查询数据

query()第一个参数是表名;第二个参数用于指定去查询哪几列,不指定的话查询所有列;第三、四个参数用于去约束查询某一行或某几行的数据,不指定默认查询所有行;第五个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤;第七个参数用于指定查询结果的排序方式。

queryButton.setOnClickListener(new OnClickListener() {
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void onClick(View v) {
<span style="white-space:pre">		</span>SQLiteDatabase db = dbHelper.getWritableDatabase();
<span style="white-space:pre">		</span>// 查询Book表中所有的数据
<span style="white-space:pre">		</span>Cursor cursor = db.query("Book", null, null, null, null, null, null);
<span style="white-space:pre">		</span>if (cursor.moveToFirst()) {
<span style="white-space:pre">			</span>do {
<span style="white-space:pre">				</span>// 遍历Cursor对象,取出数据并打印
<span style="white-space:pre">				</span>String name = cursor.getString(cursor.
<span style="white-space:pre">				</span>getColumnIndex("name"));
<span style="white-space:pre">				</span>String author = cursor.getString(cursor.
<span style="white-space:pre">				</span>getColumnIndex("author"));
<span style="white-space:pre">				</span>int pages = cursor.getInt(cursor.getColumnIndex("pages"));
<span style="white-space:pre">				</span>double price = cursor.getDouble(cursor.getColumnIndex("price"));
<span style="white-space:pre">			</span>} while (cursor.moveToNext());
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>cursor.close();
<span style="white-space:pre">	</span>}
});
最后记得关闭Cursor。

7、使用SQL操作数据库

添加数据的方法如下:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" });
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)",
new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" });
更新数据的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
"The Da Vinci Code" });
删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
查询数据的方法如下:
db.rawQuery("select * from Book", null);







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值