Форум программистов, компьютерный форум CyberForum.ru

Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде - Android

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
22.09.2014, 19:20     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #1
Привет! Есть mysql3.sqlite (импортировал данные из csv). Нужно из приложения подключится к sqlite БД и вывести данные в log. Нашел пример как можно это сделать тут: http://stackoverflow.com/questions/2...949629#5949629, но что то ничего не выходит кроме ошибки...
Подскажите в чем может быть глюк? Или может есть более простой метод подключится к уже созданной БД?
Код вот:
Java
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
package com.example.first_databases;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.app.Activity;
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.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity implements OnClickListener {
 
final String LOG_TAG = "myLogs";
 
Button btnFunc;
EditText etFunc;
TextView textView1;
 
DataBaseHelper dbHelper;
SQLiteDatabase db;
 
/** Called when the activity is first created. */
 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
btnFunc = (Button) findViewById(R.id.btnFunc);
btnFunc.setOnClickListener(this);
 
etFunc = (EditText) findViewById(R.id.etFunc);
 
textView1 = (TextView) findViewById(R.id.textView1);
}
 
public void onClick(View v) {
 
// очищаем курсор
Cursor c = null;
 
// определяем нажатую кнопку
switch (v.getId()) {
// Все записи
case R.id.btnFunc:
    try {
        readtolog(c);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
break;
}
 
}
 
//Метод для вывода данних из sqlite в log
void readtolog (Cursor c) throws IOException
{
    //создаем объект dbHelper   
    dbHelper = new DataBaseHelper(this);
 
    // подключаемся к базе
    db = dbHelper.getWritableDatabase();
 
Log.d(LOG_TAG, "-— Назначаем курсору С данные из БД —-");
//выбор всех данных БД
 
c = db.query("mysql_database", null, null, null, null, null, null);
 
if (c != null) {
if (c.moveToFirst()) {
String str;
do {
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
 
} while (c.moveToNext());
}
c.close();
} else
Log.d(LOG_TAG, "Cursor is null");
 
dbHelper.close();
}
 
public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
 
    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static final String DB_NAME = "mysql2.sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    private String DB_PATH = "/data/data/"
                        + mycontext.getApplicationContext().getPackageName()
                        + "/databases/";
 
    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }
 
    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            try {
                copydatabase();
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }   
 
    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }
 
    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);
 
        // Path to the just created empty db
        String outfilename = DB_PATH + DB_NAME;
 
        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream("DB_PATH + DB_NAME");
 
        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0) {
            myoutput.write(buffer,0,length);
        }
 
        //Close the streams
        myoutput.flush();
        myoutput.close();
        myinput.close();
    }
 
    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }
 
    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }
 
    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
        
    }
 
}
 
}
А вот xml на всякий случай:
XML
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
 
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:gravity="center_horizontal"
android:text="Справочник номеров"
android:textSize="25sp" >
 
</TextView>
 
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp" >
 
<Button
android:id="@+id/btnFunc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Поиск по имени:" />
 
<EditText
android:id="@+id/etFunc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
 
<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="50dp"
    android:textSize="25sp" />
 
</LinearLayout>
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2014, 19:20     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде
Посмотрите здесь:

ListView, ToggleButton, SQLite, CursorAdapter. Как найти idItem в ListView, где была нажата ToggleButton? Android
Подскажите, где ошибка Android
Android Копирование файла с Android на PC, или синхронизация SQLite
Подскажите программу для получения опыта работы с SQLite Android
Android SQLite или MySQL на удаленном сервере
Android Подскажите где ошибка при работе с БД
Android Как именно можно сделать SQLite запрос, если запрос уже сформирован?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
22.09.2014, 19:35     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #2
Цитата Сообщение от yourfanat Посмотреть сообщение
new FileOutputStream("DB_PATH + DB_NAME");
кавычки уберите или
Java
1
 new FileOutputStream(outfilename)
так сделайте.
А ошибка-то какая?
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
22.09.2014, 19:44  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #3
При нажатии на кнопку выдает вот что - http://saveimg.ru/pictures/22-09-14/...8832998ae4.jpg
Сделал как вы говорили, не помогло...
volvo
Супер-модератор
 Аватар для volvo
22080 / 14385 / 4044
Регистрация: 22.10.2011
Сообщений: 25,452
Записей в блоге: 2
22.09.2014, 22:16     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #4
yourfanat, залейте изображение на форум (Инструкция), ссылка на хостинг уже сейчас невалидна.
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
23.09.2014, 12:35  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #5
Спасибо! Буду знать на счет картинок.
Миниатюры
Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде  
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
23.09.2014, 12:44     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #6
Цитата Сообщение от yourfanat Посмотреть сообщение
mycontext.getApplicationContext()
mycontext null. Обращение к нему - NullPointerException
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
23.09.2014, 12:57  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #7
Т.е. получается что программа не находит БД из которой я хочу извлчечь данные для копирования
Ошибка на этой стадии?
Java
1
InputStream myinput = mycontext.getAssets().open(DB_NAME);
МОжет быть я не туда кладу БД? Сейчас она лежит в D:\es\workspace\first_databases\assets\mysql2.sqlite
first_databases - название проекта
Правильно ли я ее поместил?
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
23.09.2014, 13:00     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #8
yourfanat, Не используйте абсолютный путь.

Java
1
2
ContextWrapper cw =new ContextWrapper(getApplicationContext());
DB_PATH =cw.getFilesDir().getAbsolutePath()+ "/databases/";
Копирование из ассетов:

Java
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
private void copyDataBase()
    {
        Log.i("Database",
                "New database is being copied to device!");
        byte[] buffer = new byte[1024];
        OutputStream myOutput = null;
        int length;
        // Open your local db as the input stream
        InputStream myInput = null;
        try
        {
            myInput =myContext.getAssets().open(DB_NAME);
            // transfer bytes from the inputfile to the
            // outputfile
            myOutput =new FileOutputStream(DB_PATH+ DB_NAME);
            while((length = myInput.read(buffer)) > 0)
            {
                myOutput.write(buffer, 0, length);
            }
            myOutput.close();
            myOutput.flush();
            myInput.close();
            Log.i("Database",
                    "New database has been copied to device!");
 
 
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
23.09.2014, 13:51  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #9
Спасибо! Удалось скопировать БД - New database has been copied to device!
В БД была таблица "mysql_database" - просматривал с помощью SqliteBrowser. После переноса пытаюсь подключится к ней:
Java
1
c = db.query("mysql_database", null, null, null, null, null, null);
Но выдается ошибка в логах: no such table mysql_database
В чем может быть причина?
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
23.09.2014, 14:06     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #10
yourfanat, нет такой таблицы в БД как бы
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
23.09.2014, 14:21  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #11
Ну так таблица есть Могу прикрепить базу данных, которая в assets. Вот она:
Вложения
Тип файла: zip mysql2.zip (22 байт, 8 просмотров)
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
23.09.2014, 14:30     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #12
нет там ничего)
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
23.09.2014, 14:42  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #13
Сори, видимо тут БД просто так выкладывать нельзя. ВОт ссылка на файл: https://drive.google.com/file/d/0B6O...it?usp=sharing

Добавлено через 7 минут
На всякий случай весь код еще раз:
Java
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
package com.example.first_databases;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
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.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity implements OnClickListener {
 
final String LOG_TAG = "myLogs";
 
Button btnFunc;
EditText etFunc;
TextView textView1;
 
DataBaseHelper dbHelper;
SQLiteDatabase db;
 
/** Called when the activity is first created. */
 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
btnFunc = (Button) findViewById(R.id.btnFunc);
btnFunc.setOnClickListener(this);
 
etFunc = (EditText) findViewById(R.id.etFunc);
 
textView1 = (TextView) findViewById(R.id.textView1);
}
 
public void onClick(View v) {
 
// очищаем курсор
Cursor c = null;
 
// определяем нажатую кнопку
switch (v.getId()) {
// Все записи
case R.id.btnFunc:
    try {
        readtolog(c);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
break;
}
 
}
 
//Метод для вывода данних из sqlite в log
void readtolog (Cursor c) throws IOException
{
    //создаем объект dbHelper   
    dbHelper = new DataBaseHelper(this);
 
    // подключаемся к базе
    db = dbHelper.getWritableDatabase();
 
Log.d(LOG_TAG, "-— Назначаем курсору С данные из БД —-");
//выбор всех данных БД
 
c = db.query("mysql_database", null, null, null, null, null, null);
 
if (c != null) {
if (c.moveToFirst()) {
String str;
do {
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
 
} while (c.moveToNext());
}
c.close();
} else
Log.d(LOG_TAG, "Cursor is null");
 
dbHelper.close();
}
 
public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
 
    ContextWrapper cw =new ContextWrapper(getApplicationContext());
 
    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static final String DB_NAME = "mysql2.sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    private String DB_PATH = cw.getFilesDir().getAbsolutePath()+ "/databases/";
 
    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }
 
    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            copydatabase();
        }
    }   
 
    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }
 
    private void copydatabase()
    {
        Log.i("Database",
                "New database is being copied to device!");
        byte[] buffer = new byte[1024];
        OutputStream myOutput = null;
        int length;
        // Open your local db as the input stream
        InputStream myInput = null;
        try
        {
            myInput =mycontext.getAssets().open(DB_NAME);
            // transfer bytes from the inputfile to the
            // outputfile
            myOutput =new FileOutputStream(DB_PATH+ DB_NAME);
            while((length = myInput.read(buffer)) > 0)
            {
                myOutput.write(buffer, 0, length);
            }
            myOutput.close();
            myOutput.flush();
            myInput.close();
            Log.i("Database",
                    "New database has been copied to device!");
 
 
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
 
    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }
 
    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }
 
    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
        
    }
 
}
 
}
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
24.09.2014, 19:45  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #14
В обещем мучался создавать таблицы, ничего так и не получилось.
Вопробовал создать новую БД, адаптированную под андроид.
Использовал следующие рекомеднации отсюда: http://vlad8.com/tech/android-add-ex...-own-database/

"Представим, что у вас уже есть собственный файл базы данных. Чтобы сделать его съедобным для Андроид-приложения, необходимо немного отредактировать базу, для чего вы можете воспользоваться, например, SQLite Database Browser, доступным для всех платформ.

Откройте вашу базу и добавьте новую таблицу под названием «android_metadata», воспользуйтесь для этого следующим запросом:

SQL
1
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
Теперь добавим одну строку с текстом «en_US» в таблицу «android_metadata»:

SQL
1
INSERT INTO "android_metadata" VALUES ('en_US')
Потом нужно переименовать первичное поле id ваших таблиц на «_id», чтобы Андроид распознал поле идентификаторов ваших таблиц. В SQLite Database Browser это можно сделать нажав на кнопку Редактировать, потом выбрав таблицу, которую вы хотите изменить, и, наконец, выбрав поле для переименования.

После выполнения указанных операций база данных готова для использования в приложениях Андроид."


Получил базу данных: mydb5.sqlite
Вот ссылка на нее https://drive.google.com/file/d/0B6O...it?usp=sharing

В программе вроде бы как удается скопировать БД, но при попытке считать данные из таблицы пишет что таблица не найдена - no such table: mydb

В чем может быть дело, подскажите плиз. Финальный код:

Java
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
package com.example.first_databases;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
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.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity implements OnClickListener {
 
final String LOG_TAG = "myLogs";
 
Button btnFunc;
EditText etFunc;
TextView textView1;
 
DataBaseHelper dbHelper;
SQLiteDatabase db;
 
/** Called when the activity is first created. */
 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
btnFunc = (Button) findViewById(R.id.btnFunc);
btnFunc.setOnClickListener(this);
 
etFunc = (EditText) findViewById(R.id.etFunc);
 
textView1 = (TextView) findViewById(R.id.textView1);
}
 
public void onClick(View v) {
 
// очищаем курсор
Cursor c = null;
 
// определяем нажатую кнопку
switch (v.getId()) {
// Все записи
case R.id.btnFunc:
    try {
        readtolog(c);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
break;
}
 
}
 
//Метод для вывода данних из sqlite в log
void readtolog (Cursor c) throws IOException
{
    //создаем объект dbHelper   
    dbHelper = new DataBaseHelper(this);
 
    // подключаемся к базе
    db = dbHelper.getWritableDatabase();
 
Log.d(LOG_TAG, "-— Назначаем курсору С данные из БД —-");
//выбор всех данных БД
 
c = db.query("mydb", null, null, null, null, null, null);
 
if (c != null) {
if (c.moveToFirst()) {
String str;
do {
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
 
} while (c.moveToNext());
}
c.close();
} else
Log.d(LOG_TAG, "Cursor is null");
 
dbHelper.close();
}
 
public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
 
    ContextWrapper cw =new ContextWrapper(getApplicationContext());
 
    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static final String DB_NAME = "mydb5.sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    private String DB_PATH = cw.getFilesDir().getAbsolutePath()+ "/databases/";
 
    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }
 
    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            copydatabase();
        }
    }   
 
    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }
 
    private void copydatabase()
    {
        Log.i("Database",
                "New database is being copied to device!");
        byte[] buffer = new byte[1024];
        OutputStream myOutput = null;
        int length;
        // Open your local db as the input stream
        InputStream myInput = null;
        try
        {
            myInput =mycontext.getAssets().open(DB_NAME);
            // transfer bytes from the inputfile to the
            // outputfile
            myOutput =new FileOutputStream(DB_PATH+ DB_NAME);
            while((length = myInput.read(buffer)) > 0)
            {
                myOutput.write(buffer, 0, length);
            }
            myOutput.close();
            myOutput.flush();
            myInput.close();
            Log.i("Database",
                    "New database has been copied to device!");
 
 
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
 
    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }
 
    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }
 
    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
        
    }
 
}
 
}
Добавлено через 6 часов 5 минут
Никто не сталкивался такой проблемой?
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
25.09.2014, 17:40  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #15
Возникли новые обстоятельства. До меня только что дошло на какой стадии ошибка, но из за чего она и как ее испправить не знаю...
Ошибка на стадии создания БД для переноса. У меня нет root прав, и я не знаю где храняться БД на устройстве, может путь не так прописан? Или права какие то назначать нужно. Скрин прилагаю, что делать подскажите
Миниатюры
Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде  
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
25.09.2014, 17:47  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #16
Т.е. срабатывает первый лог - началось копирование. Но второй лог - копирование завершено не выдается... Т.е. в середине какая то ошибка...
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
25.09.2014, 23:40     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Посмотрите через DDMS записался ли вообще файл и куда. Разве getFilesDir().getAbsolutePath() возвращает не data/data/package.name/files ? И получается что бд лежит в data/data/package.name/files/database/ а нужно в data/data/package.name/database/.
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
26.09.2014, 14:40  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #18
Оно! заработало! )))) Спасибо большое! Допилю код, и выложу рабочий вариант сюда. Может быть кому то пригодится
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
30.09.2014, 14:41  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #19
Пришел к выводу, что лучше всего полностью вручную указывать путь к месту хранения БД. Вот работащий код:
Java
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
package com.example.first_databases;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
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.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity implements OnClickListener {
 
final String LOG_TAG = "myLogs";
 
Button btnFunc;
EditText etFunc;
TextView textView1;
 
DataBaseHelper dbHelper;
SQLiteDatabase db;
 
/** Called when the activity is first created. */
 
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
 
btnFunc = (Button) findViewById(R.id.btnFunc);
btnFunc.setOnClickListener(this);
 
etFunc = (EditText) findViewById(R.id.etFunc);
 
textView1 = (TextView) findViewById(R.id.textView1);
}
 
public void onClick(View v) {
 
// очищаем курсор
Cursor c = null;
 
// определяем нажатую кнопку
switch (v.getId()) {
// Все записи
case R.id.btnFunc:
    try {
        readtolog(c);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
break;
}
 
}
 
//Метод для вывода данних из sqlite в log
void readtolog (Cursor c) throws IOException
{
    //создаем объект dbHelper   
    dbHelper = new DataBaseHelper(this);
 
    // подключаемся к базе
    db = dbHelper.getWritableDatabase();
 
Log.d(LOG_TAG, "-— Назначаем курсору С данные из БД —-");
//выбор всех данных БД
 
c = db.query("geo_cities", null, null, null, null, null, null);
 
//String sqlQuery = "SELECT name, volume FROM mysql";
//c = db.rawQuery(sqlQuery, new String[] {});
 
Log.d(LOG_TAG, "-— Данные назначены курсору С —-");
 
if (c != null) {
if (c.moveToFirst()) {
String str;
do {
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
 
} while (c.moveToNext());
}
c.close();
} else
Log.d(LOG_TAG, "Cursor is null");
 
dbHelper.close();
}
 
public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
 
    ContextWrapper cw =new ContextWrapper(getApplicationContext());
 
    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static final String DB_NAME = "russian_towns.sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    
    private String DB_PATH = "/data/data/com.example.first_databases/databases/";
    
  
 
    public DataBaseHelper(Context context) throws IOException {
        super(context, DB_NAME, null, 1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }
 
    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            copydatabase();
        }
    }   
 
    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }
 
    private void copydatabase()
    {
        Log.i("Database",
                "New database is being copied to device!");
        byte[] buffer = new byte[1024];
        OutputStream myOutput = null;
        int length;
        // Open your local db as the input stream
        InputStream myInput = null;
        try
        {
            myInput = mycontext.getAssets().open(DB_NAME);
            // transfer bytes from the inputfile to the
            // outputfile
            myOutput = new FileOutputStream(DB_PATH + DB_NAME);
            while((length = myInput.read(buffer)) > 0)
            {
                myOutput.write(buffer, 0, length);
            }
            myOutput.close();
            myOutput.flush();
            myInput.close();
            Log.i("Database",
                    "New database has been copied to device!");
 
 
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
 
    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }
 
    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }
 
    @Override
    public void onCreate(SQLiteDatabase arg0) {
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
        
    }
 
}
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2014, 15:50     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде
Еще ссылки по теме:

Простейший запрос к SQLite (или схожу сума) Android
Где хранится файл базы данных SQLite на устройстве? Android
Android Где хранятся файлы с БД SQLite в Android Studio?
Выбрать hasmap или sqlite Android
Android Подскажите где ошибка в коде (блютуз-мессенджер)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
yourfanat
5 / 5 / 0
Регистрация: 30.10.2013
Сообщений: 177
06.10.2014, 15:50  [ТС]     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде #20
Т.к. запрос в топе, решил более подробно всю процедуру подключения к sqlite описать тут. Спасибо всем за помощь в формировании правильного кода!
Yandex
Объявления
06.10.2014, 15:50     Как подключиться к уже существующей sqlite, или подскажите где ошибка в коде
Ответ Создать тему
Опции темы

Текущее время: 05:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru