2013-05-01 2 views
1

안드로이드에서 응용 프로그램을 작성하고 SQlite 데이터베이스를 사용하여 메신저. 사용자 선택에 따라 표에 열을 추가하고 싶습니다. 그래서 사용자는 테이블에 원하는 열을 추가 할 수 있습니다. 예를 들어 사용자는 "동물"표를 가지고 있으며 "개", "고양이"및 "물고기"에 대한 열을 추가하려고합니다.안드로이드 SQLite 데이터베이스를 사용하여 동적 열을 만드는 방법

나는 몇 가지 해결책에 대해 읽었으며 나에게 도움이되는 것을 보지 못했습니다. 나는 열을 추가 할 수있는 간단한 방법을 사용하고 있음을 읽어

 @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     // If you need to add a column 
     if (newVersion > oldVersion) { 
      db.execSQL("ALTER TABLE " + TableName + " ADD COLUMN " + ColumnName); 
     } 
} 

하지만 사용자의 choise하여 테이블에 추가 될 컬럼의 이름이 무엇인지 선택 기운이 내 문제를,이 문자열에 대한 매개 변수가 없습니다. 그래서 나는 이것과 같은 것을 사용하고 직접 호출하려고 시도했다.

 @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion, String newColumnName) { 

     // If you need to add a column 
     if (newVersion > oldVersion) { 
      db.execSQL("ALTER TABLE " + TableName + " ADD COLUMN " + newColumnName); 
     } 
} 

그러나이 방법으로 오류가 발생했습니다.

데이터베이스 버전에 대한 다른 질문이 있습니다. onUpgrade 메서드는 onCreate가 호출 될 때 자동으로 호출됩니다. onUpgrade에는 데이터베이스 버전에 대한 oldVersion 및 newVersion 매개 변수가 있습니다. 언제 oldVersion 및 newVersion 매개 변수를 설정합니까? newVersion 매개 변수를 2,3,4 ...로 설정하는 방법은 무엇입니까?

+0

은 데이터베이스 디자인이 좋지 않은 것 같습니다. 당신은 같은 것을 달성하기 위해 관계를 사용할 수 없다고 확신합니까? – Gustek

+0

@Gustek 대답 해 주셔서 감사합니다. 관계가 무엇을 의미합니까? 더 많은 테이블을 열려면? 하지만 그때 나는 같은 문제가 있습니다. 내 테이블 번호는 내가 처음 설정 한 번호로 제한되기 때문에. 그리고 내 사용자가 "버드"테이블을 추가하고 싶다면 그것을 할 수있는 방법이 없습니다. – tomer

+0

왜 열이어야하고 다른 테이블의 행이 아니며 many to many 관계가되어야합니까? 저장하려고하는 데이터 구조 란 무엇입니까? – Gustek

답변

1

추가 열 데이터를 보유 할 보조 테이블을 만들 수 있습니다. 기본 테이블에 대한 쿼리는 새로운 뷰의 쿼리로 변환 될 수 있습니다.

create table if not exists animal (pk integer primary key, name); 

create table if not exists animal_aux (animal_pk, col_name, col_val); 

create view if not exists animal_view 
    as select animal.name as name, 
       ct.col_val as cat, 
       dt.col_val as dog 
     from animal, animal_aux as ct, animal_aux as dt 
     where animal.pk = ct.animal_pk 
      and animal.pk = dt.animal_pk 
      and ct.col_name = 'cat' 
      and dt.col_name = 'dog' 
; 

이 스키마

animal_pk, col_name 기본 키 또는 animal_aux 적어도 unique을 향상해야한다. animal 테이블에 항목을 삽입하거나 삭제할 때 Aux 테이블의 항목을 추가하거나 제거하려면 트리거가 필요할 수도 있습니다.

예 :

sqlite> select * from animal_view; 
sqlite> insert into animal values (NULL, 'fred'); 
sqlite> select * from animal_view; 
sqlite> select * from animal; 
1|fred 
sqlite> insert into animal_aux values (1, "dog", "beagle"); 
sqlite> insert into animal_aux values (1, "cat", "siamese"); 
sqlite> select * from animal_view; 
fred|siamese|beagle 
sqlite> 

가상 열을 추가 할 때마다, 당신은 적절한 여분의 열 및 where 조항으로 다시 작성 후

drop view animal_view; 

해야합니다.

+0

Doug Currie의 답변에 감사드립니다. 그러나 나는 당신의 대답을 이해하지 못했습니다. Java에서이 코드가 무엇입니까? 작성한 첫 번째 코드는 어떤 방법입니까? 업그레이드 중입니까? 이 방법의 매개 변수는 무엇입니까? – tomer

+0

코드는 SQL로되어 있으며 SQLite 셸로 테스트되었습니다. 응용 프로그램에서 이러한 명령문을 구성하고 execSQL을 사용하여 이러한 명령문을 실행해야합니다. –

+0

아쉽습니다. 고마워요. – tomer

0

final static String Database_name = "empDb.db";

public DatabaseHelper(Context context) { 
    super(context, Database_name, null, 1); 
} 
@Override public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table emp_tbl (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,salary TEXT)"); 
} 

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS tbl_emp"); 
} 

블로그 : https://itmulc.blogspot.com/2016/08/android-sqlite-database-with-complete.html 그것에 대해 더 많은 정보를 가져옵니다. https://www.youtube.com/watch?v=W8-Z85oPNmQ

관련 문제