Lendo banco de dados SQLite no Android

Categoria: Android
Publicado em 28 de Julho de 2011

Caso um banco de dados SQLite já exista, para usá-lo num aplicativo Android:

a) Criar a classe DataBaseHelper:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package fhu.com.br;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
 
public class DataBaseHelper extends SQLiteOpenHelper{
 
    // Android's folder for all your databases. You only have to change
	// "fhu.com.br" to match yours
    private static String DB_PATH = "/data/data/fhu.com.br/databases/";
 
    // Name of the database file
    private static String DB_NAME = "nomebanco.sqlite";
 
    // Internal variables
    private SQLiteDatabase dbHandle; 
    private final Context dbContext;
 
    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */
    public DataBaseHelper(Context context) {
     	super(context, DB_NAME, null, 1);
        this.dbContext = context;
    }	
 
    /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase() throws IOException {
 
    	// Verifies if the database already exist
    	boolean dbExist = checkDataBase();
 
    	if (!dbExist) {
 
    		// By calling this method and empty database will be created into the default system path
            // of your application so we are gonna be able to overwrite that database with our database.
        	this.getReadableDatabase();
 
        	try {
     			this.copyDataBase();
     		} catch (IOException e) {
         		throw new Error("Erro ao copiar banco de dados");
         	}
    	}
     }
 
    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase(){
 
    	SQLiteDatabase checkDB = null;
 
    	try {
    		String myPath = DB_PATH + DB_NAME;
    		checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
     	} catch (SQLiteException e) {
     		// database does't exist yet.
     	}
 
    	if (checkDB != null) {
     		checkDB.close();
     	}
 
    	return checkDB != null ? true : false;
    }
 
    /**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{
 
    	// Openn local db as the input stream
    	InputStream myInput = dbContext.getAssets().open(DB_NAME);
 
    	// Path to the just created empty db
    	String outFileName = DB_PATH + DB_NAME;
 
    	// Opens the empty db as the output stream
    	OutputStream myOutput = new FileOutputStream(outFileName);
 
    	// Transfers bytes from the inputfile to the outputfile
    	byte[] buffer = new byte[1024];
    	int length;
    	while ((length = myInput.read(buffer))>0){
    		myOutput.write(buffer, 0, length);
    	}
 
    	// Closes the streams
    	myOutput.flush();
    	myOutput.close();
    	myInput.close();
 
    }
 
    public void openDataBase() throws SQLException{
     	// Open the database
        String myPath = DB_PATH + DB_NAME;
        dbHandle = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
     }
 
    @Override
	public synchronized void close() {
     	if (dbHandle != null)
     		dbHandle.close();
     	super.close();
 	}
 
	@Override
	public void onCreate(SQLiteDatabase dbHandle) {
 
	}
 
	@Override
	public void onUpgrade(SQLiteDatabase dbHandle, int oldVersion, int newVersion) {
 
	}
 
 
}

b) Copiar o arquivo nomebanco.sqlite para o folder /assets/ do projeto Android.

c) Na classe principal do aplicativo (Activity):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    	DataBaseHelper myDbHelper;
    	myDbHelper = new DataBaseHelper(this);
 
    	try {
    		myDbHelper.createDataBase();
    	} catch (IOException ioe) {
    		throw new Error("Não foi possível criar o banco de dados.");
    	}
 
    	try {
    		myDbHelper.openDataBase();
    	} catch (SQLException sqle){
    		throw sqle;
    	}

NOTA: O plugin do Firefox SQLite Manager ou o aplicativo SQLite Database Browser são dois bons aplicativos gerenciadores de banco de dados SQLite, ambos gratuitos.

FONTE: Conteúdo original deste artigo em Using your own SQLite database in Android applications.

 

Copyright © Fernando Hidemi Uchiyama 2010 - Todos os direitos reservados