2013-10-15 2 views
0

SqLite에서 테이블을 삭제하는 데 문제가 있습니다.sqlite에서 열 이름을 포함한 테이블 삭제

내가

db.delete (TABLE_NAME, NULL, NULL)를 use- 경우;

테이블의 내용은 삭제되지만 열 이름은 여전히 ​​유지됩니다. 열 이름도 어떻게 삭제합니까?

또한 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); 
} 
} 

현재 MainActicity에서도 on_click에서 deletetable 함수를 인스턴스화하고 있습니다. Logcat은 오류를 표시하지 않지만 검색된 열 이름을 인쇄 할 때 이미 항목이 삭제 된 일부 열 이름을 인쇄합니다. 나는 그 칼럼을 원하지 않는다.

그리고 어떤 방법 으로든 업그레이드 방법을 사용하지 않습니다.

답변

1

드롭 테이블 SQL (DROP TABLE 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; 
관련 문제