1

好吧,我对 android 完全陌生,通过我的努力,我创建了一个应用程序,它将所有与您的日常生活相关的密码存储在数据库中。因此,当您需要或感到困惑时,您可以通过此应用程序访问。

好吧,我的一位朋友告诉了一个选项,可以对存储的任何内容进行备份,以备不时之需,并避免将来丢失任何关键数据。

因此,我正在考虑在我的应用程序中实现一个按钮,当用户单击该按钮时,必须将存储在数据库中的所有信息备份到 SDCard,扩展名为 .txt(为什么是 .txt,因为它甚至可以轻松导入到系统中)方便参考)。

我的数据库的详细信息:它包含五个字段。

_id(varchar), profile(varchar), username(varchar), description(varchar), password(varchar)


public class DatabaseHandler {

public static final String KEY_ROWID = "_id";
public static final String KEY_PROFILE = "profile";
public static final String KEY_UNAME = "uname";
public static final String KEY_DESC = "desc";
public static final String KEY_PASSWORD = "password";
private static final String TAG = "DBAdapter";
//private static final String TAG = DBAdapter.class.getSimpleName();

private static final String DATABASE_NAME = "mypass";
private static final String DATABASE_TABLE = "mypasswords";
private static final int DATABASE_VERSION = 1;

private static final String DATABASE_CREATE =
    "create table mypass (_id integer primary key autoincrement, "+ "profile varchar ,"+ "uname varchar  ,"+ "desc varchar  ,"+ "pass varchar");";

  private final Context context; 

   private DatabaseHelper DBHelper;
   private SQLiteDatabase db;

   public DatabaseHandler(Context ctx) 
   {
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
   }

 private static class DatabaseHelper extends SQLiteOpenHelper 
 {
   DatabaseHelper(Context context) 
   {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
   }

   @Override
   public void onCreate(SQLiteDatabase db) 
   {
       db.execSQL(DATABASE_CREATE);
   }

   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, 
   int newVersion) 
   {
        Log.w(TAG, "Upgrading database from version " + oldVersion 
               + " to "
               + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS productdet");
       onCreate(db);
    }
}    

//---opens the database---
 public DatabaseHandler open() throws SQLException 
{
     db = DBHelper.getWritableDatabase();
     return this;
}

//---closes the database---    
public void close() 
{
    DBHelper.close();
}

 //---insert a title into the database---
public long insertTitle(String proname, String procost) 
{
     ContentValues initialValues = new ContentValues();
     initialValues.put(KEY_PRONAME, proname);
     initialValues.put(KEY_PROCOST, procost);
     return db.insert(DATABASE_TABLE, null, initialValues);
}

//---deletes a particular title---
public boolean deleteTitle(long rowId) 
{
     return db.delete(DATABASE_TABLE, KEY_ROWID + 
        "=" + rowId, null) > 0;
}

//---retrieves all the titles---
public Cursor getAllTitles() 
{
     return db.query( DATABASE_TABLE, new String[] {
           KEY_ROWID, 
           KEY_PRONAME,
           KEY_PROCOST,
            }, 
            null, 
            null, 
            null, null, null);
}


//---retrieves a particular title---
public Cursor getTitle(long rowId) throws SQLException 
{
    Cursor mCursor =
        db.query(true, DATABASE_TABLE, new String[] {
                KEY_ROWID,
                KEY_PRONAME, 
                KEY_PROCOST,

                }, 
                KEY_ROWID + "=" + rowId, 
                null,
                null, 
                null, null, null 
                );
    if (mCursor != null) {
         mCursor.moveToFirst();
    }
    return mCursor;
}

//---updates a title---
public boolean updateTitle(long rowId, String proname, 
String procost) 
{
    ContentValues args = new ContentValues();
    args.put(KEY_PRONAME, proname);
    args.put(KEY_PROCOST, procost);
    return db.update(DATABASE_TABLE, args, 
                 KEY_ROWID + "=" + rowId, null) > 0;
}

}

所以每一行的备份必须是一个在另一个之下。

例子:

1 台自动柜员机 sg sbi 1234

2 银行 xxx ICICI @1234xxx

3 yyy ggfb hgfds 734687

某种编码和示例参考对我有好处。当我用谷歌搜索时,我没有找到任何 .txt 格式的备份。

希望我能找到一个好的答复来完成备份项目。

帮助肯定会受到赞赏。提前致谢。

4

3 回答 3

1

我同意 andDev 关于在未加密的 txt 文件中存储关键密码的安全问题。假设您要备份到 SDCard,您应该执行类似于以下几行的操作:

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/mybackupfolder/");
dir.mkdirs();
File file = new File(dir, "mybackup.txt");

String content = //  figure out how to read your DB and create a string in the format you want

setContents(file,content);

其中 setContents() 方法是下面的方法。

private void setContents(File aFile, String aContents)
            throws FileNotFoundException, IOException {
        if (aFile == null) {
            throw new IllegalArgumentException("File should not be null.");
        }
        if (!aFile.exists()) {
            throw new FileNotFoundException("File does not exist: " + aFile);
        }
        if (!aFile.isFile()) {
            throw new IllegalArgumentException("Should not be a directory: " + aFile);
        }
        if (!aFile.canWrite()) {
            throw new IllegalArgumentException("File cannot be written: " + aFile);
        }

        //declared here only to make visible to finally clause; generic reference
        Writer output = null;
        try {
            //use buffering
            //FileWriter always assumes default encoding is OK!
            output = new BufferedWriter(new FileWriter(aFile));
            output.write(aContents);
        } finally {
            //flush and close both "output" and its underlying FileWriter
            if (output != null) {
                output.close();
            }
        }
    }
于 2013-10-02T07:00:24.570 回答
0

请多写一点关于你想要达到的目标。但是将密码存储到 .txt 文件中对我来说似乎并不安全。

阅读这篇博文了解更多信息:http ://android-developers.blogspot.com/2013/02/using-cryptography-to-store-credentials.html

于 2013-10-02T06:48:56.240 回答
0

好吧,这不太安全,但您可以将数据库存储在 sdcard 中

1) save .sqlite file in SDcard.

2) convert database in CSV file and then save it in SDcard.

3) you can save on server if application access internet.

您可以查看有关 csv 的信息

将 sqlite 导出为 csv

将 .csv 文件导入 Android 中的 Sqlite

于 2013-10-02T06:57:06.497 回答