将 Sugar ORM 数据库存储在 sd 卡而不是默认路径 android

store the Sugar ORM database in sd card rather than default path android

我正在使用 sugar orm 将我的数据存储在 android 的 sqlite 数据库中,它运行良好,所以现在我想将数据存储在本地存储而不是默认路径中,所以我该如何实现那而且那是有可能做到这一点 谢谢。 这是我的主要活动代码

public class MainActivity extends AppCompatActivity {

EditText firstname;
EditText lastname;
Button button;
Note note;

public SQLiteDatabase database;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    firstname=findViewById(R.id.edit1);
    lastname=findViewById(R.id.edit2);
    button=findViewById(R.id.button);

}



@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();


    return id == R.id.action_settings || super.onOptionsItemSelected(item);

}


public void click(View view) {

    String first = firstname.getText().toString();
    String last = lastname.getText().toString();

    note = new Note(first, last);

    note.save();
    if (note.getFirstname() != null && note.getLastname() != null) {

        firstname.setText("");
        lastname.setText("");
    }
    onShareDb();

    //Log.e("Notes saved", String.valueOf(onShareDb()));

}
public void show(View view) {
    String one=note.getFirstname();
    String two=note.getLastname();

    Log.e("firstName",one);
    Log.e("lastName",two);
}

public void update(View view) {

    note = Note.findById(Note.class, 4);
    Log.e("firstName",note.getFirstname());
    note.setFirstname("kullu");
    Log.e("firstName",note.getFirstname());
    note.save();


}

public void delete(View view) {

    note = Note.findById(Note.class, 2);
    if(note.getId()==null){
        Toast.makeText(this,"there is no such data",Toast.LENGTH_SHORT).show();
    }
    Log.e("firstName",note.getFirstname());
    note.delete();
    Log.e("firstName",note.getFirstname());

}


public void onShareDb() {
    @SuppressLint("SimpleDateFormat") SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
    String output_name = "YourApp_" + df.format(new Date()) + ".db";
    File output_file = new File(getExternalCacheDir() + File.separator + output_name);

    try {
        File file = new File(new SugarDb(MainActivity.this).getDB().getPath()); // get private db reference
        if (!file.exists() || file.length() == 0) throw new Exception("Empty DB");
        //IOUtils.copy(new FileInputStream(file), new FileOutputStream(output_file));
     /*   Intent i = new Intent(Intent.ACTION_SEND);
        i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(output_file));
        startActivity(Intent.createChooser(i, "Send db"));*/

        database = SQLiteDatabase.openDatabase(output_file

                        + File.separator + "notes.db", null,

                SQLiteDatabase.OPEN_READWRITE);

        Log.e("storage", String.valueOf(database));



    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "Unable to export db: " + e.getMessage(), Toast.LENGTH_SHORT).show();
         Log.e("storage", e.getMessage());
    }
}



}

所以,基本上我试图通过使用 sugar orm 的 shareDB() 属性 来获取存储图像的路径,并试图将默认路径覆盖到我的新路径,所以我该如何完成它,我在按钮点击侦听器中调用 shareDB 方法,异常类似于未知错误:无法打开数据库。

经过大量研究和试错,我设法成功地将 sqllite 文件从目录中的一个文件夹复制到另一个文件夹

这是代码,

  private void copyDatabase() throws IOException {

    File actualFile = new File(new SugarDb(MainActivity.this).getDB().getPath());
    File cuurentfile  = new File(actualFile.toString());
    Log.e("actualPath", actualFile.toString());


    File newFile = createTempFile("sugarFiles",".db",Environment.getExternalStorageDirectory());

    Log.e("newPath", newFile.toString());

 boolean yes=FileUtils.copyFile(cuurentfile,newFile);

 if(yes) {

     Log.e("result", "" + true);
 }

}

在点击侦听器中调用此复制数据库函数,或者在您插入数据库的任何地方调用此函数,确保它是在您设置插入值之后,在我的例子中

public void click(View view) {

    String first = firstname.getText().toString();
    String last = lastname.getText().toString();

    note = new Note(first, last);

    note.save();
    if (note.getFirstname() != null && note.getLastname() != null) {

        firstname.setText("");
        lastname.setText("");
    }
    try {
        copyDatabase();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

FileUtils.java

import java.io.BufferedInputStream;
 import java.io.File;
  import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class FileUtils {

FileUtils instance = null;

public FileUtils getInstance() {
   instance = new FileUtils();
   return instance;
}

public static Boolean copyFile(File sourceFile, File destFile)
        throws IOException {
 //        if (!destFile.exists()) {
        destFile.createNewFile();

        FileChannel source = null;
        FileChannel destination = null;
        try {
            source = new FileInputStream(sourceFile).getChannel();
            destination = new FileOutputStream(destFile).getChannel();
            destination.transferFrom(source, 0, source.size());
        } finally {
            if (source != null)
                source.close();
            if (destination != null)
                destination.close();
        }
        return true;
 //        }
 //        return false;
}

/**
 * Read a text file into a String.
 *
 * @param file
 *            File to read (will not seek, so things like /proc files are
 *            OK).
 * @return The contents of the file as a String.
 * @throws IOException
 */
public static String readTextFile(File file) throws IOException {
    byte[] buffer = new byte[(int) file.length()];
    BufferedInputStream stream = new BufferedInputStream(
            new FileInputStream(file));
    stream.read(buffer);
    stream.close();

    return new String(buffer);
}

}

希望有一天能对某人有所帮助...祝你有美好的一天