如何将我的android数据库备份为文本格式

时间:2013-10-02 06:39:57

标签: android backup notepad

好吧,我对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 ATM sg sbi 1234

2 BANK xxx ICICI @ 1234xxx

3 yyy ggfb hgfds 734687

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

希望我找到一个好的回复,而不是完成备份项目。

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

3 个答案:

答案 0 :(得分: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();
            }
        }
    }

答案 1 :(得分:0)

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

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

答案 2 :(得分: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的信息

export sqlite into csv

Import .csv file to Sqlite in Android