您的位置:首页 > 编程语言

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

2015-03-10 19:44 281 查看
三种存储方式:文件、SharedPreference、数据库。

一、文件存储

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

1、将数据存储到文件中
context的openFileOutput()返回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、添加数据

对数据的操作无非四种,即CUID。Create、Retrieve、Update、Delete。

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: