上一篇说了SQLite的使用------单张图片存储,本片说说多张图片资源的存储,删除,在文章最后附上DEMO
先上两张图片:
为什么要存储图片:
1、手机数据大多都是从网络加载的,不存储,每次滚动界面都要从新发送网络请求加载数据,浪费流量尤其是图片
2、当用户没网的时候,就不能正常显示界面了
3、将数据存储到本地,不用每次加载,没网的时候也可从本地存储的数据拿来显示
一、第一步创建好数据库,表名,字段名
//创建数据库
public class DBHelper extends SQLiteOpenHelper
{
public DBHelper(Context context) {
super(context, Gloable.DB_NAME, null, Gloable.DB_VERSION);
}
/**
* 创建数据库
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE IF NOT EXISTS "
+ Gloable.TABLE_NAME
+ "(id INTEGER PRIMARY KEY NOT NULL,pictureId INTEGER NOT NULL,pictureName varchar not null)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
}
二、这里对数据库进行操作,单独封装一个操作类
public class DBContror {
private DBHelper picdb;
private List<Picture> all = new ArrayList<Picture>();
public DBContror(Context context) {
picdb = new DBHelper(context);
all = queryAllItem(); // 查询全部数据
// 如果不存在数据就初始化数据库并添加数据
if (all.size() > 0) {
} else {
initDB(getData());
}
}
/**
* 数据库初始化
*
* @param value
* @return
*/
private long initDB(List<Picture> value) {
long row = 0;
SQLiteDatabase db = picdb.getWritableDatabase();
picdb.onCreate(db);
ContentValues values = null;
Picture map = null;
try {
while (value.size() > 0) {
map = value.remove(0);
values = new ContentValues();
values.put("pictureId", map.getImageId());
values.put("pictureName", map.getTitle());
row = db.insert(Gloable.TABLE_NAME, null, values);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db.isOpen()) {
db.close();
}
}
return row;
}
/**
* 添加数据
*
* @param picBean
* @return
*/
public long insertItem(Picture picBean) {
long row = 0;
try {
SQLiteDatabase db = picdb.getWritableDatabase();
picdb.onCreate(db);
ContentValues contentValues = new ContentValues();
contentValues.put("pictureId", picBean.getImageId());
contentValues.put("pictureName", picBean.getTitle());
row = db.insert(Gloable.TABLE_NAME, null, contentValues);
db.close();
} catch (Exception e) {
}
return row;
}
/**
* 按名称删除指定名称(name)的数据
*
* @param name
* @return
*/
public int deleteById(String name) {
int i = 0;
try {
String[] sb = new String[1];
sb[0] = name;
SQLiteDatabase db = picdb.getWritableDatabase();
picdb.onCreate(db);
i = db.delete(Gloable.TABLE_NAME, "pictureName=?", sb);
} catch (Exception e) {
}
return i;
}
/**
* 查询数据库中是否存在名称为name的数据
*
* @param name
* @return
*/
public boolean checkByName(String name) {
Cursor cursor;
try {
SQLiteDatabase db = picdb.getWritableDatabase();
picdb.onCreate(db);
cursor = db.query(Gloable.TABLE_NAME, null, "pictureName=?",
new String[]{name}, null, null, null);
cursor.moveToFirst();
int count = cursor.getCount();
db.close();
if (count > 0) {
cursor.close();
return true;
}
cursor.close();
} catch (Exception e) {
}
return false;
}
/**
* 查询数据库所有的数据
*
* @return
*/
public List<Picture> queryAllItem() {
SQLiteDatabase db = picdb.getReadableDatabase();
picdb.onCreate(db);
List<Picture> pictures = new ArrayList<Picture>();
try {
Cursor cursor = db.query(Gloable.TABLE_NAME, null, null, null,
null, null, null);
while (cursor.moveToNext()) {
Picture picture = new Picture();
picture.setImageId(cursor.getInt(cursor
.getColumnIndex("pictureId")));
picture.setTitle(cursor.getString(cursor
.getColumnIndex("pictureName")));
pictures.add(picture);
}
cursor.close();
db.close();
} catch (Exception e) {
}
return pictures;
}
/**
* 查看picture数据库是否已经存在该图片
*/
public boolean checkPic(Picture picture) {
try {
SQLiteDatabase db = picdb.getWritableDatabase();
picdb.onCreate(db);
String clientCode = picture.getTitle();
Cursor cursor = db.query(Gloable.TABLE_NAME, null, "pictureName=?",
new String[]{clientCode}, null, null, null);
cursor.moveToFirst();
int count = cursor.getCount();
db.close();
if (count > 0) {
cursor.close();
return true;
}
cursor.close();
} catch (Exception e) {
}
return false;
}
/**
* 初始化添加系统数据
*
* @return
*/
private List<Picture> getData() {
List<Picture> list = new ArrayList<Picture>();
for (int i = 0; i < Gloable.IMAGES.length; i++) {
Picture picture = new Picture();
picture.setImageId(Gloable.IMAGES[i]);
picture.setTitle(Gloable.TITLES[i]);
list.add(picture);
}
return list;
}
数据库的类就是这两个,接下来就是界面的增加与删除操作
三、主界面中初始化数据库,并先查询数据库中是否有数据,先后获取显示
public class MainActivity extends Activity implements View.OnClickListener {
private GridView gridView;
private PictureAdapter adapter;
private DBContror dbcon;
private List<Picture> mylist;
private Intent intent;
private Button mhelp_btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
mhelp_btn = (Button) findViewById(R.id.help_btn);
mhelp_btn.setOnClickListener(this);
TextView tv = (TextView) findViewById(R.id.maintextTile);
tv.setText(R.string.main_menu);
dbcon = new DBContror(this);// 初始化数据库
mylist = dbcon.queryAllItem();// 查询数据库中的全部数据,并存放到List<Picture>中
intent = new Intent();
gridView = (GridView) findViewById(R.id.gridview);
adapter = new PictureAdapter(mylist, this);// 自定义适配器
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
OnClickGridViewItem(position);// 点击事件
}
});
}
/**
* GridView中图标点击事件
*
* @param position
*/
protected void OnClickGridViewItem(int position) {
String result = mylist.get(position).getTitle();
if (result.endsWith("测试")) {
// 进入AppStoreActivity
intent.setClass(MainActivity.this, AppStoreActivity.class);
MainActivity.this.startActivity(intent);
} else {
Toast.makeText(MainActivity.this, mylist.get(position).getTitle(),
Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onResume() {
super.onResume();
mylist = dbcon.queryAllItem();
adapter = new PictureAdapter(mylist, this);
adapter.notifyDataSetChanged();
gridView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);//功能菜单键
return true;
}
/**
* 功能菜单选项
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.About:
Toast.makeText(MainActivity.this, "关于", Toast.LENGTH_SHORT).show();
break;
case R.id.Exit:
// Toast.makeText(MainActivity.this, "退出", Toast.LENGTH_SHORT).show();
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
intent.setClass(this, MainActivity.class);
Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
startActivity(i);
break;
default:
break;
}
return false;
}
/**
* 管理应用(删除操作)
*
* @param view
*/
public void OnManage(View view) {
// Intent in=new Intent(MainActivity.this, ManageActivity.class);//删除图片放开
Intent in = new Intent(MainActivity.this, AppStoreActivity.class);//增加图片放开
startActivity(in);
}
/**
* 禁用返回键
*/
public void onBackPressed() {
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.help_btn:
// Intent sel = new Intent(MainActivity.this, SelActivity.class);//这里准备做相册选择多张图片存储(未完成)
// startActivity(sel);
break;
}
}
}
四、图片添加类,这里只是固定了几个资源图片,将资源图片添加到主界面中,存储到数据库。
public class AppStoreActivity extends Activity {
private static final int REQUEST_CAMERA_CODE = 10;
private static final int REQUEST_PREVIEW_CODE = 20;
private ArrayList<String> imagePaths = new ArrayList<>();
private GridView gridView_sel;
private GridAdapter gridAdapter;
private TextView tv_click;
private EditText textView;
private String TAG = MainActivity.class.getSimpleName();
private GridView gridView;
private PictureAdapter adapter;
private Intent intent;
private List<Picture> mylist;
private DBContror dbcon;
//资源名
public String[] addtitles = new String[]{"DB1", "DB2", "DB3", "DB4", "DB5",
"DB6"};
//资源图片
public Integer[] addimages = new Integer[]{
R.drawable.ic_launcher,
R.drawable.ic_launcher,
R.drawable.ic_launcher,
R.drawable.ic_launcher,
R.drawable.ic_launcher,
R.drawable.ic_launcher};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.manage);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
TextView tv = (TextView) findViewById(R.id.adddeltextTile);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent in = new Intent(AppStoreActivity.this, SelActivity.class);
startActivity(in);
}
});
tv.setText(R.string.add);
dbcon = new DBContror(this);
intent = new Intent();
gridView = (GridView) findViewById(R.id.gridview);
mylist = new ArrayList<Picture>();
for (int i = 0; i < addtitles.length; i++) {
Picture newPic = new Picture();
newPic.setImageId(addimages[i]);
newPic.setTitle(addtitles[i]);
mylist.add(newPic);
}
adapter = new PictureAdapter(mylist, this);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
}
});
//长按item进行添加图片
gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (dbcon.checkByName(mylist.get(position).getTitle())) {
Toast.makeText(AppStoreActivity.this,
"该应用已经存在无法再次添加!正在返回请稍后……", Toast.LENGTH_SHORT)
.show();
} else {
dbcon.insertItem(mylist.get(position));
adapter.notifyDataSetChanged();
Toast.makeText(AppStoreActivity.this, "添加成功!正在返回请稍后……",
Toast.LENGTH_SHORT).show();
}
intent.setClass(AppStoreActivity.this, MainActivity.class);
AppStoreActivity.this.startActivity(intent);
return false;
}
});
}
/**
* 返回主页
*
* @param view
*/
public void onMain(View view) {
intent.setClass(AppStoreActivity.this, MainActivity.class);
AppStoreActivity.this.startActivity(intent);
}
/**
* 禁用返回键
*/
public void onBackPressed() {
}
五、 此类为删除图片类,删除选中的图片更新列表。
public class ManageActivity extends Activity{
private GridView gridView;
private PictureAdapter adapter;
private Intent intent;
private DBContror dbcon;
private List<Picture> mylist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.manage);
// getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);
TextView tv = (TextView) findViewById(R.id.adddeltextTile);
tv.setText(R.string.delete);
dbcon = new DBContror(this);
mylist = dbcon.queryAllItem();
intent = new Intent();
gridView = (GridView) findViewById(R.id.gridview);
adapter = new PictureAdapter(mylist, this);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
if (position < 2) {
Toast.makeText(ManageActivity.this, "系统应用,无法删除!正在返回请稍后……",
Toast.LENGTH_SHORT).show();
} else {
dbcon.deleteById(mylist.get(position).getTitle());
adapter.notifyDataSetChanged();
Toast.makeText(ManageActivity.this, "删除成功!正在返回请稍后……",
Toast.LENGTH_SHORT).show();
}
onBack(null);
}
});
}
public void onBack(View view) {
intent.setClass(ManageActivity.this, MainActivity.class);
ManageActivity.this.startActivity(intent);
}
public void onMain(View view) {
intent.setClass(ManageActivity.this, MainActivity.class);
ManageActivity.this.startActivity(intent);
}
/**
* 禁用返回键
*/
public void onBackPressed() {
}
比较简单的一个例子,主要代码已贴,代码没有整理比较凌乱,不影响学习,demo无BUG可执行。
百度网盘:下载 提取码:6qdr
CSDN:下载