2013-10-15 4 views
0

У меня проблема с удалением таблиц в SqLite.Удаление таблицы в sqlite, включая имена столбцов

Если я потребительный

db.delete (TABLE_NAME, NULL, NULL);

Содержимое таблицы удаляется, но имена столбцов все еще остаются. Как удалить имена столбцов?

Я также пробовал db.execSQL («DROP TABLE IF EXISTS» + TABLE_NAME + «Имя таблицы»);

Но это совсем не работает.

Как я могу удалить всю таблицу программно или есть способ удалить всю базу данных без использования телефона (иначе мы получим ошибки «Разрешения на отказ») через код?

Вот часть кода, связанного с onCreate, созданием и удалением таблиц.

package com.example.appchecker; 



import java.io.File; 

import com.example.appchecker.FeedReaderContract.CycDetails; 
import com.example.appchecker.FeedReaderContract.FeedEntry; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class FeedReaderDbHelper2 extends SQLiteOpenHelper { 
    // If you change the database schema, you must increment the database version. 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "final31.db"; 
    public static boolean exists = false; 
private static final String TEXT_TYPE = " TEXT"; 
private static final String COMMA_SEP = ", "; 
private static final String SQL_CREATE_ENTRIES = 
    " CREATE TABLE " +FeedEntry.TABLE_NAME + " (" + 
    FeedEntry._ID + " INTEGER PRIMARY KEY" + COMMA_SEP + 
    FeedEntry.COLUMN_NAME_NUMBER + TEXT_TYPE + COMMA_SEP + 
    FeedEntry.COLUMN_NAME_APP_NAME + TEXT_TYPE + COMMA_SEP + 
    FeedEntry.COLUMN_NAME_PKG_NAME + TEXT_TYPE + 
    // Any other options for the CREATE command 
    ");"; 

private static final String SQL_CREATE_ENTRIES2 = 
     " CREATE TABLE " +CycDetails.TABLE_NAME + " (" + 
     CycDetails._ID + " INTEGER PRIMARY KEY" + COMMA_SEP + 
     CycDetails.COLUMN_NAME_CYCLENAME + TEXT_TYPE + COMMA_SEP + 
     CycDetails.COLUMN_NAME_DATE + TEXT_TYPE + COMMA_SEP + 
     CycDetails.COLUMN_NAME_OSVERSION + TEXT_TYPE + COMMA_SEP + 
     CycDetails.COLUMN_NAME_SWVERSION + TEXT_TYPE + 
     // Any other options for the CREATE command 
     ");"; 



private static final String SQL_DELETE_ENTRIES1 = 
    "DROP TABLE IF EXISTS " + DATABASE_NAME.substring(0,DATABASE_NAME.length()-3)+".Mobile_App_Details"; 
private static final String SQL_DELETE_ENTRIES2 = 
     "DROP TABLE IF EXISTS " + DATABASE_NAME.substring(0, DATABASE_NAME.length()-3)+".Cycle_Details"; 

public FeedReaderDbHelper2(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 
public void onCreate(SQLiteDatabase db) { 




     db.execSQL(SQL_CREATE_ENTRIES); 
     db.execSQL(SQL_CREATE_ENTRIES2); 
     return; 

} /*Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+FeedEntry.TABLE_NAME+"'", null); 
    System.out.println("In on create1") ; 
if(cursor==null) 
{ 
     System.out.println("In on create") ; 
     db.execSQL(SQL_CREATE_ENTRIES); 

    } 
    else 
    { 
     System.out.println("Update phase") ; 
     exists=true; 
    } 
    */ 
    } 

public static void deletetable(SQLiteDatabase db) 
{ 



    db.delete(FeedEntry.TABLE_NAME, null, null); 
    db.delete(CycDetails.TABLE_NAME, null, null); 
    db.execSQL(SQL_DELETE_ENTRIES1); 
    db.execSQL(SQL_DELETE_ENTRIES2); 

} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // This database is only a cache for online data, so its upgrade policy is 
    // to simply to discard the data and start over 
    //System.out.println("Update phase") ; 
    db.execSQL(SQL_DELETE_ENTRIES1); 
db.execSQL(SQL_DELETE_ENTRIES2); 
    //db.delete(FeedEntry.TABLE_NAME, null, null); 
    onCreate(db); 
} 
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    onUpgrade(db, oldVersion, newVersion); 
} 
} 

В настоящее время я инстанцировании функцию deletetable в качестве on_click даже в MainActicity. Logcat не показывает ошибок, но когда я печатаю имена найденных столбцов, он печатает некоторые имена столбцов, записи которых уже удалены. Мне не нужны эти столбцы.

И я никоим образом не использую метод обновления.

ответ

1

Вы должны исправить свой синтаксис таблицы drop SQL (DROP TABLE IF EXISTS - два раза), нет причин, по которым он не работает.

Если вы получили отказ в разрешении, убедитесь, что вы обращаетесь к базе данных своего приложения, а не к другой базе данных приложения. Двойная проверка, что вы использовали правильное имя пакета, если это необходимо, когда вы создали свою базу данных.

+0

извините, что это была опечатка. Я редактировал свой вопрос. Проблема не в этом. – SoulRayder

+0

показать коды, которые вы использовали для создания своей базы данных и logcat, когда вы получаете ошибку. – ayon

0

удалите таблицу из базы данных.

db.execSQL ("DROP TABLE IF EXISTS" + YOUR_TABLE);

+0

Как я уже сказал, это не удаляет всю таблицу. Если я сохранил таблицу в базе данных, должен ли я получить к ней доступ с помощью оператора точек? то есть db.execSQL ("DROP TABLE IF EXISTS" + DATABASE_NAME + "." + YOUR_TABLE); – SoulRayder

0

Чтобы отказаться от таблицы, просто используйте инструкцию DROP TABLE.

Имя таблицы должно быть точно то же, что вы использовали в заявлении CREATE TABLE. В вашем случае это должно быть:

SQL_DELETE_ENTRIES1 = "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME; 
SQL_DELETE_ENTRIES2 = "DROP TABLE IF EXISTS " + CycDetails.TABLE_NAME; 
Смежные вопросы