SQLite deleteDatabase.

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Kron24rus
Сообщения: 8
Зарегистрирован: 22 мар 2015, 19:32

SQLite deleteDatabase.

Сообщение Kron24rus » 22 мар 2015, 19:42

Здравствуйте, уже некоторое время разрабатываю небольшое приложение. Только начал изучать Android и Java.
Пока в БД была 1 таблица, проблем не было, использовал просто sql запрос drop table.
Сейчас база разрослась до 11 таблиц, и первый вопрос(как создать несколько таблиц я вроде нагуглил, не уверен что оптимально но работает), то второй, как дропнуть всю базу остаётся открытым.
Смог найти что в SQLite нету такого запроса как drop database, и что нужно использовать deleteDatabase чтобы удалить сам файл базы.

Код базы. Пока тестирую приложение хотел каждый раз при изменение базы просто удалять всё, и создавать заново. Пока была 1 таблица, при обновление версии, удалялась таблица и создавалась новая onCreate(db), но как сделал db.deleteDatabse(file), при вызове onCreate(db) вылетает ошибка о том что таблицы уже созданы. Как так получается ума не приложу...
Может кто пояснить что не так делаю, или так и должно быть?

Код: Выделить всё

public class LyricsDataBaseHelper extends SQLiteOpenHelper implements BaseColumns {

    private static final String DATABASE_NAME = "lyrics_database.db";
    private static final int DATABASE_VERSION = 8;
    public static final String TABLE_NAME_SONGS = "songs";
    public static final String SONGNAME = "songname";
    public static final String LYRICS = "lyrics";
    public static final String TABS = "tabs";
    public static final String STRUM = "strum";
    public static final String FINGERING = "fingering";
    public static final String TABLE_NAME_ACCORD = "accords";
    public static final String ACCORD_NAME = "accordname";
    public static final String ACCORD_APPLICATURA = "applicatura";
    public static final String TABLE_NAME_PERFORMER = "performer";
    public static final String PERFORMER_NAME = "perfmane";
    public static final String TABLE_NAME_GROUP = "groups";
    public static final String GROUP_NAME = "groupname";

    private static final String SQL_CREATE_TABLE_SONG = "CREATE TABLE " + TABLE_NAME_SONGS +
            " (" + LyricsDataBaseHelper._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + SONGNAME + " VARCHAR(30), "
                    + LYRICS + " TEXT, "
                    + STRUM + " TEXT, "
                    + TABS + " TEXT, "
                    + FINGERING + " TEXT);";

    private static final String SQL_CREATE_TABLE_CHORDS = "CREATE TABLE " + TABLE_NAME_ACCORD +
            " (" + LyricsDataBaseHelper._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + ACCORD_NAME + " VARCHAR(15), "
                    + ACCORD_APPLICATURA + " TEXT);";

    public static final String SQL_CREATE_TABLE_PERFORMER = "CREATE TABLE " + TABLE_NAME_PERFORMER +
            " (" + LyricsDataBaseHelper._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + PERFORMER_NAME + " VARCHAR(50));";

    public static final String SQL_CREATE_TABLE_GROUP = "CREATE TABLE " + TABLE_NAME_GROUP +
            " (" + LyricsDataBaseHelper._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + GROUP_NAME + " VARCHAR(50));";

    private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + TABLE_NAME_SONGS;

    public LyricsDataBaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_TABLE_SONG);
        db.execSQL(SQL_CREATE_TABLE_CHORDS);
        db.execSQL(SQL_CREATE_TABLE_GROUP);
        db.execSQL(SQL_CREATE_TABLE_PERFORMER);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w("LOG_TAG", "Обновление базы данных с версии " + oldVersion + " до версии " + newVersion + ", которое удалит все старые данные");
        File file = new File(db.getPath());
        db.deleteDatabase(file);
      //  onCreate(db);
    }
}

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite deleteDatabase.

Сообщение Foenix » 22 мар 2015, 21:13

не мудри, а в onUpgrade просто перед созданием каждой таблицы делай ее drop table if exists
сколько работаю, на ум не приходило всю базу удалять.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Kron24rus
Сообщения: 8
Зарегистрирован: 22 мар 2015, 19:32

Re: SQLite deleteDatabase.

Сообщение Kron24rus » 28 апр 2015, 22:41

Новая проблема появилась...
Пытаюсь сделать так, чтобы база данных на телефоне, сохранялась в облако(так сказать) на сервере, где стоит MS SQL SERVER 2008... То есть синхронизировалась SQLite с MS SQL...
Поиском по форуму уже много тем перерыл, но не нашёл ничего наводящего... Может что просмотрел?
Пока на вооружение взял это: http://www.quizful.net/post/using-jdbc
И это: http://habrahabr.ru/post/206790/
И основная идея, просто подключаться к БД, и переписывать из SQLite всё, в MS SQL...
Может кто более опытный направит что почитать\посмотреть?)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: SQLite deleteDatabase.

Сообщение Foenix » 29 апр 2015, 00:37

ответить на твой вопрос сложно, очень много писать придется.
одно дело - соединиться, другое - синхронизация. Все зависит от задачи и еще много чего.
Выход у тебя - читать читать и читать и думать как решить именно твою задачу.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

powerewop
Сообщения: 4
Зарегистрирован: 28 май 2015, 19:19

Re: SQLite deleteDatabase.

Сообщение powerewop » 28 май 2015, 19:45

есть такие штуки - репликаторы называются. погугли

Kron24rus
Сообщения: 8
Зарегистрирован: 22 мар 2015, 19:32

Re: SQLite deleteDatabase.

Сообщение Kron24rus » 30 май 2015, 22:25

В общем немного разобрался.
И следующий вопрос возник - триггеры... Они мне мозг уже дня 2 вносят, более менее с простыми я разобрался, а вот где выходят условия... И главное не могу найти внятную документацию или мануал :evil: :evil:
Пытаюсь написать триггер который при добавлении, проверит имя на существование, и если существует то изменит его, добавив (ID), я не считаю что это сильно практично и оптимально, но пока хочу сделать так :D
Тестировал триггеры на базе MS SQL, там они отлично работают, а вот портировать в SQLite не получается ну никак(((

Вот что у меня получилось в MS SQL
[syntax=mysql]
create trigger chekNames
on SONG
after insert
as
declare @newname VARCHAR(50)
if (select COUNT(name) from SONG where NAME = (select name from inserted)) > 1
begin
set @newname = (select NAME from inserted) + '(' + CAST((select MAX(SONG_ID) FROM SONG) AS VARCHAR(100)) + ')'
update SONG set NAME = @newname where SONG_ID = (select SONG_ID FROM SONG WHERE SONG_ID = (SELECT MAX(SONG_ID) FROM SONG))
end
[/syntax]

Вот что в SQLite: да уже вроде вижу несколько ошибок, но пока никак не могу исправить...
[syntax=mysql]
create trigger checkname after insert on songs
begin
select case
when ((select count(songname) from songs where songname = new.songname) > 1)
then update songs set songname = (songname + '()') where _ID = (select _ID from songs where _ID = (new._ID));
end;
[/syntax]

Kron24rus
Сообщения: 8
Зарегистрирован: 22 мар 2015, 19:32

Re: SQLite deleteDatabase.

Сообщение Kron24rus » 31 май 2015, 01:22

Так, есть прогресс. Я написал триггер который в итоге меняет что надо, но он тупо заменяет на ноль...
Как сделать замену более верно? Похоже сейчас найду но всё же)
[syntax=mysql]
create trigger checkName after insert on songs
when ((select count(songname) from songs where songname = new.songname) > 1)
begin
update songs set songname = (songname + '()') where _ID = new._ID;
end;
[/syntax]
updated:
Дошёл, неожиданно конечно, но оказалось что конкатенация в SQLite это не "+" а "||".
Рабочий:
[syntax=mysql]
create trigger checkName after insert on songs
when ((select count(songname) from songs where songname = new.songname) > 1)
begin
update songs set songname = (songname || '(' || new._ID || ')') where _ID = new._ID;
end;
[/syntax]

Ответить