如何在内部保存我的数据?
Posted
技术标签:
【中文标题】如何在内部保存我的数据?【英文标题】:How do I save my data internally? 【发布时间】:2013-09-12 22:11:11 【问题描述】:我正在尝试创建一个“待办事项列表”,并且我已经完成了所有工作,除了保存数据。我是新手,想知道是否有人可以告诉我如何在内部完成保存数据。
这是我的代码:
Main_ToDoList.java
public class Main_ToDoList extends Activity implements OnClickListener
private Button btnAdd;
private EditText et;
private ListView lv;
ArrayList<String> list = new ArrayList<String>();
ArrayAdapter<String> adapter;
final Context context = this;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
btnAdd = (Button)findViewById(R.id.addTaskBtn);
btnAdd.setOnClickListener(this);
et = (EditText)findViewById(R.id.editText);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, list);
// set the lv variable to your list in the xml
lv=(ListView)findViewById(R.id.list);
lv.setAdapter(adapter);
// set ListView item listener
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id)
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle("Confirm Delete");
alertDialogBuilder.setMessage("Sure you want to delete?");
alertDialogBuilder.setCancelable(false);
alertDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int i)
adapter.remove(adapter.getItem(position));
);
alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int i)
dialogInterface.cancel();
);
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
);
public void onClick(View v)
String input = et.getText().toString();
if(input.length() > 0)
adapter.add(input);
et.setText("");
@Override
public boolean onCreateOptionsMenu(Menu menu)
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main__to_do_list, menu);
return true;
我将如何保存我输入的数据?谢谢!
【问题讨论】:
developer.android.com/guide/topics/data/data-storage.html 你要保存什么数据? 【参考方案1】:您有 3 种方法可以做到这一点: 共享首选项 文件 数据库
如果你想存储比使用dataBase更多的数据,如果你想存储10-30个任务,你可以使用SharedPreferences,这是最快的方式。
无论如何,如果您熟悉写入/读取文件,这也是不错的路径,但可能需要更多工作。
【讨论】:
【参考方案2】:你可以创建一个 DatabaseHandler 类
package com.connection;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;
public class DatabaseHandler extends SQLiteOpenHelper
// ====================== String Variables ======================
// The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.example/databases/"; // Package name
private static final String DATABASE_NAME = "test"; // Database Name
// ++++++++++++++++++++++ int Variables ++++++++++++++++++++++
private static final int DATABASE_VERSION = 1; // Database Version
// = = = = = = = = = = = Other Variables = = = = = = = = = = ==
private SQLiteDatabase myDataBase;
private final Context myContext;
SQLiteDatabase db;
public DatabaseHandler(Context context)
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.myContext = context;
public void db_open()
db = this.getWritableDatabase();
/**
* Creates a empty database on the system and rewrites it with your own
* database.
* */
public void createDataBase() throws IOException
boolean dbExist = databaseExist();
if (dbExist)
// do nothing - database already exist
else
// By calling this method and empty database will be created into
// the default system path
// of your application so we are gone a be able to overwrite that
// database with our database.
this.getReadableDatabase();
try
copyDataBase(); // call method to copy database
db = this.getWritableDatabase();
catch (IOException e)
throw new Error("Error copying database");
/**
* Mrthod to check database is exist or not
* @return
*/
public boolean databaseExist()
File dbFile = new File(DB_PATH + DATABASE_NAME);
return dbFile.exists();
/**
* Copies your database from your local assets-folder to the just created
* empty database in the system folder, from where it can be accessed and
* handled. This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException
// Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DATABASE_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DATABASE_NAME;
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0)
myOutput.write(buffer, 0, length);
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
/**
* Close Database
*/
@Override
public synchronized void close()
if (myDataBase != null)
myDataBase.close();
super.close();
public void DB_close()
if(db!=null)
db.close();
/**
* Method to add data
*/
public boolean addData(int vno,String content1,String content2)
boolean status=false;
ContentValues values = new ContentValues();
String checkEntry = "select id from yourtable where id="+vno;// +"' AND userid="+userid;
Cursor magazinecursor = db.rawQuery(checkEntry, null);
if (magazinecursor.moveToFirst())
else
values.put("id", vno);
values.put("content1", content1);
values.put("content2", content2);
long check = db.insert("yourtable", null, values);
if (check > -1)
Log.i("inserstatus", "yourtable insert successfull");
status = true;
else
Log.i("insertstatus", "yourtable insert unsuccessful");
return status;
@Override
public void onCreate(SQLiteDatabase db)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
然后在你要保存数据的Activity中
DatabaseHandler myDbHelper;
myDbHelper = new DatabaseHandler(MainActivity.this);
myDbHelper.db_open();
myDbHelper.addData(1,"sample",sample);
希望这会对您或其他人有所帮助....
【讨论】:
抱歉没有使用数据库。我对 sharedPreferences 更感兴趣。【参考方案3】:我有一些类似的东西,我想存储少量数据,但不想使用内容提供程序或文件,所以我使用了 SharePreferences。 (ps我在密钥末尾使用随机数只是为了使其唯一,但用户稍后从列表中选择它,所以我知道该值)
SharedPreferences sp = this.getPreferences( Context.MODE_PRIVATE );
SharedPreferences.Editor editor = sp.edit();
Random rand = new Random();
int randomNum = rand.nextInt( 1000 );
editor.putString( "EQUATION_KEY_" + String.valueOf( randomNum ), textToSave);
editor.commit();
【讨论】:
sharedPreference 是否允许您动态创建项目?因为这是一个待办事项列表,每次添加新值时我都需要保存它,但我也会从中删除项目。所以我不希望我删除的项目显示出来 是的,我还使用“editor.remove(KEY_TO_DELETE);”从 SharedPrefs 中删除其中 KEY_TO_DELETE 是用户从 ListView 中选择的项目的键 所以要清楚,首先我用上面的代码填充共享首选项,然后将所有共享首选项呈现给用户,他们可以选择保存的值之一,也可以删除它们。密钥是随机的这一事实对我来说并不重要,因为用户从列表中选择项目,此时我得到密钥,然后我可以将它传递给删除函数以将其从共享首选项中删除 我正在尝试保存我的数据。所以首先我向列表视图添加了几个项目(这都发生在同一页面上)然后当我关闭应用程序并重新启动它时,我希望能够让我添加的数据仍然存在。现在,当我关闭应用程序并重新启动它时,数据就消失了。 我想将列表视图保存到 sharedPreference onDestroy。这样我可以重写保存的数据,而不必担心从 sharedPreference 中删除以上是关于如何在内部保存我的数据?的主要内容,如果未能解决你的问题,请参考以下文章