Fonte do problema : Os bancos de dados SQLite no Android geralmente são autônomos. Quando há muitos dados no banco de dados de um aplicativo, é obviamente uma perda de tempo reconfigurar todos os dados no banco de dados toda vez que você muda a máquina , então a melhor maneira é acessar um banco de dados existente.
Solução :
Solução 1 : A operação no Eclipse é limitada ao uso do simulador.
etapa:
- Abra a visualização do File Explorer no Eclipse. O File Explorer é usado para visualizar os arquivos do dispositivo. O método de abertura é executar a operação [Window]-[Show View]-[other]-[File Explorer] no Eclipse.
- Encontre o local do arquivo a ser importado, que é o local padrão do diretório database/data/data/<nome do pacote>/database.
- Selecione o diretório, clique no ícone do dispositivo [Puxar um arquivo do dispositivo] no canto superior direito e selecione o banco de dados para fazer upload.
O diagrama é o seguinte:
Opção 2 : Coloque o banco de dados no diretório res/raw e copie-o para o diretório /data/data/<package name>/database ao acessar o banco de dados pela primeira vez. Isso é aplicável tanto a simuladores quanto a máquinas reais.
O código copiado é o seguinte:
try {
String filePath = context.getCacheDir().getAbsolutePath();
String DATABASE_PATH = filePath.substring(0, filePath.length() - 5)
+ "databases";
String DATABASE_FILENAME = "usmartscada.db";
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
if (!dir.exists()) {
dir.mkdir();
}
if (!(new File(databaseFilename)).exists()) {
InputStream is = context.getResources().openRawResource(R.raw.usmartscada);;
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[8192];
int count = 0;
// 开始复制文件
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
O nome do banco de dados no exemplo de código acima é usmartscada.db. Isso também prova que o banco de dados copiado pode ser lido e gravado normalmente. Não há problema de permissões insuficientes para leitura e gravação. No entanto, existem vários problemas com o acima código. .
Por que os arquivos de banco de dados existentes devem ser colocados na pasta res/raw? Eles podem ser colocados em outro lugar?
Se colocado na pasta res/raw, o arquivo de banco de dados deve ser determinado e não pode ser alterado quando o apk for empacotado, caso contrário, ele terá que ser recompilado e gerado o apk todas as vezes, o que será muito problemático ao usá-lo, então é melhor colocar o arquivo de banco de dados em algum lugar do cartão SD.Após a verificação, sabe-se que o arquivo do banco de dados pode ser colocado em outros locais, como um determinado local no cartão SD. Quanto a onde colocá-lo, depende da situação específica. O código acima é apenas um exemplo. De Claro, ele pode ser colocado em locais diferentes para acessar o arquivo. A forma do tempo também é diferente. Claro, observe que quando quiser acessar o cartão SD, você deve adicionar a permissão para acessar o cartão SD no arquivo AndroidManifest.xml.
- O código acima não determina se o arquivo de banco de dados existente existe? Uma é pelo rigor do código e a outra é porque o banco de dados existente pode não ser necessário em uma máquina especial. Você mesmo deseja configurar e gerar o banco de dados. Nesse caso, não há necessidade de copiar o banco de dados anterior.
Esta questão depende da situação real para determinar se é necessário julgar se o arquivo de banco de dados existente existe. O julgamento depende do local onde o arquivo de banco de dados está colocado. Além disso, se não houver como julgar se o arquivo de banco de dados existe na pasta res/raw, porque o método usado para acessar os arquivos na pasta res/raw é R.raw.xxx. Se o arquivo não existir, não há como obter o objeto do arquivo de banco de dados, então não há não há como julgar. Acrescentarei algum conhecimento sobre os arquivos na pasta res/raw. O caminho absoluto é "android.resource://" + getPackageName() + R.raw.xxx.