Saltar para conteúdo


Foto
- - - - -

[SQLite] SDCARD Duvida


  • Por favor inicie sessão para responder
3 respostas a este tópico

#1 Castelo

Castelo

    Membro

  • Membros
  • PipPip
  • 24 mensagens

Mensagem publicada 24 October 2012 - 14:54

Boa dia pessoal, tenho uma duvida quando estou a tentar aceder a DB pelo o SDCARD não consigo ler os dados, mas sem ser pelo o SDCARD funciona tudo correctamente, alguma sugestão?


sqlite returned: error code = 1, msg = no such table: TAB_UTENTES, db=/mnt/sdcard/DB.db



Permissões

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.WRITE_OWNER_DATA" />

Classe DB

package com.example.test2;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.format.DateFormat;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {

/**
* Este é o endereço onde o android salva os bancos de dados criado pela aplicação,
* /data/data/<namespace da aplicacao>/databases/
*/
//private static String DBPATH = "/data/data/com.example.test2/databases/";
	private static String DBPATH = "/mnt/sdcard/";
// Este é o nome do banco de dados
private static String DBNAME ="DB.db";

private static String TAG ="DatabaseHelper:";

//private SQLiteDatabase db;
private SQLiteDatabase myDataBase;

private Context context;

/**
* O construtor necessita do contexto da aplicação
*/
public DatabaseHelper(Context context) {
	/* O primeiro argumento é o contexto da aplicacao
	 * O segundo argumento é o nome do banco de dados
	 * O terceiro é um pondeiro para manipulação de dados
	 * O quarto é a versão do banco de dados
	 */
	super(context, "DB.db", null, 1);
	Log.i(TAG, "DatabaseHelper Construtor");
	this.context = context;
}

/**
* Os métodos onCreate e onUpgrade precisam ser sobreescrito
*/
@Override
public void onCreate(SQLiteDatabase db) {
	/*
	 * Estamos utilizando o banco do assets, por isso o
	 * código antigo deste método não é mais necessário.
	 */
	 Log.i(TAG, "onCreate");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	/*
	 * Estamos criando a primeira versão do nosso banco de dados,
	 * então não precisamos fazer nenhuma alteração neste método.
	 *
	 */
	 Log.i(TAG, "onUpgrade");
}

/**
* Método auxiliar que verifica a existencia do banco
* da aplicação.
*/
private boolean checkDataBase() {

	SQLiteDatabase db = null;	
	try {
	 String path = DBPATH + DBNAME;
	 db =
		SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
	 db.close();
	 Log.i(TAG, "checkDataBase");
	} catch (SQLiteException e) {
	 // O banco não existe
		Log.d(TAG, "banco dados não existe");
	}	
	// Retorna verdadeiro se o banco existir, pois o ponteiro irá existir,
	// se não houver referencia é porque o banco não existe
	return db != null;
}

private void createDataBase()
throws Exception {	
	// Primeiro temos que verificar se o banco da aplicação
	// já foi criado
	boolean exists = checkDataBase();	
	if(!exists) {
	 // Chamaremos esse método para que o android
	 // crie um banco vazio e o diretório onde iremos copiar
	 // no banco que está no assets.
	 this.getReadableDatabase();
	 Log.i(TAG, "createDataBase ");
	 // Se o banco de dados não existir iremos copiar o nosso
	 // arquivo em /assets para o local onde o android os salva
	 try {
		copyDatabase();
	 } catch (IOException e) {
		 Log.d(TAG, "Erro ao copiar arquivo");
		throw new Error("Não foi possível copiar o arquivo");
	 }	
	}
}

/**
* Esse método é responsável por copiar o banco do diretório
* assets para o diretório padrão do android.
*/
	private void copyDatabase() throws IOException {

		String dbPath = DBPATH + DBNAME;

		// Abre o arquivo o destino para copiar o banco de dados
		OutputStream dbStream = new FileOutputStream(dbPath);
		Log.i(TAG, "copyDatabase ");
		// Abre Stream do nosso arquivo que esta no assets
		InputStream dbInputStream = context.getAssets().open("scaDB.db");

		byte[] buffer = new byte[1024];
		int length;
		while ((length = dbInputStream.read(buffer)) > 0) {
			dbStream.write(buffer, 0, length);
		}

		dbInputStream.close();
		dbStream.flush();
		dbStream.close();

	}

	public SQLiteDatabase getDatabase() {

		try {
			// Verificando se o banco já foi criado e se não foi o
			// mesmo é criado.
			createDataBase();

			// Abrindo database
			String path = DBPATH + DBNAME;
			Log.i(TAG, "getDatabase");
			return SQLiteDatabase.openDatabase(path, null,
					SQLiteDatabase.OPEN_READWRITE);
		} catch (Exception e) {
			Log.d(TAG, "retornar banco de dados");
			// Se não conseguir copiar o banco um novo será retornado
			return getWritableDatabase();

		}

	}
/*
public void openDataBase() throws SQLException{

	//Open the database
	String myPath = DBPATH + DBNAME;
	myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

	}

	@Override
	public synchronized void close() {

	if(myDataBase != null)
	myDataBase.close();

	super.close();

	}*/

public Cursor getCartao(String id, boolean needAll) {	
		String[] args = null;
		String query = "Select * from TAB_UTENTES";
		Log.i(TAG, "getCartao");
		if(!needAll){
			query += " WHERE CARTAO = ?";
			args = new String[]{id};
		}
		return (getReadableDatabase().rawQuery(query, args));
	}

public Cursor getActividades(String id, boolean needAll) {	
		String[] args = null;
		String query = "SELECT * FROM TAB_ACTIVIDADE";
		Log.i(TAG, "getActividades");
		if(!needAll){
			query += " WHERE UTENTE_ID = (SELECT ID FROM TAB_UTENTES WHERE CARTAO = ?)";
			args = new String[]{id};
		}
		return (getReadableDatabase().rawQuery(query, args));
	}

	public Cursor verfMovimento(String Cartao) {
		String[] args = null;
		String query = "SELECT MAX(ROWID),CARTAO,TABTIPMOV_ID from MOVIMENTOS";
		Log.i(TAG, "verfMovimento");

		query += " WHERE CARTAO = ?";
		args = new String[] { Cartao };

		return (getReadableDatabase().rawQuery(query, args));
	}


public void InserirMovimentos(String _CARTAO,String _LEITOR_ID, int _TABTIPMOV_ID, String currentDateTimeString) {	
	 try
	 {
	 String[] args = null;
		String query = "INSERT INTO MOVIMENTOS (CARTAO,LEITOR_ID,TABTIPMOV_ID,DATAMOV) " +
				"VALUES ('"+_CARTAO+"'," +
							"'"+_LEITOR_ID+"'," +
								"'"+_TABTIPMOV_ID+"'," +
										"'"+currentDateTimeString+"')";
		Log.i(TAG, "Função - InserirRegistos");				
		getWritableDatabase().execSQL(query);
	 }
	 catch( SQLException ex)
	 {
		 Log.i(TAG, "Exception: " + ex.getMessage());			
	 }
	 finally
	 {
		 getWritableDatabase().close();
	 }
	}


}


Editado por Castelo, 25 October 2012 - 09:37.


#2 Driver

Driver

    Membro

  • Membros
  • PipPip
  • 51 mensagens

Mensagem publicada 25 October 2012 - 18:10

Experimenta só /sdcard

#3 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 30 October 2012 - 12:00

E mostrar o erro que dá no logcat :) Aliás... O logcat da altura... uma linha só não chega :)

#4 lordnins

lordnins

    Membro

  • Membros
  • PipPip
  • 11 mensagens

Mensagem publicada 01 November 2012 - 22:26

Na minha opinião tens ai um problema com a path hardcoded isto porque em determinados dispositivos não é esse o caminho /mnt/sdcard, o melhor a fazeres é usar a classe Environment e os seus métodos, mais precisamente Environment.getExternalStorageDirectory().

Mais info http://developer.and...rageDirectory().