2011-09-15 2 views
7

열 이름이 다른 arraylist가 있습니다. 나는 전달한 arraylist를 기반으로 테이블을 만들어야하는 generatized create 메서드를 갖고 싶습니다. 테이블을 동적으로 생성 할 수있는 구조를 가질 수 있습니까? 해결책을 제안하십시오.배열의 요소 수를 기준으로 런타임에 sqlite 테이블을 만들 수 있습니까?

private static class OpenHelper extends SQLiteOpenHelper { 

     OpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     System.out.println("openhelper1"); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.d("**DataHelper", "***********in oncreate"); 
     db.execSQL("CREATE TABLE " + TABLE_NAME + " (username TEXT,altnum TEXT,passkey TEXT,flag TEXT)"); 

    } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w("Example", "Upgrading database, this will drop tables and recreate."); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    } 
} 
+1

, 그의 정확히 내가 필요 지금 내가 어떤 해결책을 찾기 didnt가까지, 귀하의 질문이 나에게 도움이 될 수 – Abhi

+0

예를 바란다 의심이다. 있을 수있다. 적절한 DDL (데이터 정의 언어)을 생성하고 다른 것과 마찬가지로 쿼리가 아닌 명령으로 보냅니다. 테이블 생성 체계는 물론 로컬 규칙에 따라 달라집니다. SQL 키워드 충돌을 피하려면 모든 식별자를 인용하십시오. –

+0

감사합니다. 코드를 작성하기가 쉽도록 몇 가지 예를들 수 있습니다. 내가 가진 코드로 내 질문을 편집했습니다. oncreate 함수에서 배열의 크기에 따라 달라 지므로 고정 인수를 유지하지 않습니다. – neha

답변

8

나는 테이블을 생성하고 값을 generatized 방식으로 삽입하기 위해 자체 클래스를 만들었습니다. 네하 @

public void createDynamicDatabase(Context context,String tableName,ArrayList<String> title) { 

      Log.i("INSIDE createLoginDatabase() Method","*************creatLoginDatabase*********"); 
      try { 

       int i; 
       String querryString; 
       myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null);   //Opens database in writable mode. 
       //System.out.println("Table Name : "+tableName.get(0)); 

       querryString = title.get(0)+" VARCHAR(30),"; 
       Log.d("**createDynamicDatabase", "in oncreate"); 
       for(i=1;i<title.size()-1;i++) 
       {    
        querryString += title.get(i); 
        querryString +=" VARCHAR(30)"; 
        querryString +=","; 
       } 
       querryString+= title.get(i) +" VARCHAR(30)"; 

       querryString = "CREATE TABLE IF NOT EXISTS " + tableName + "("+querryString+");"; 

       System.out.println("Create Table Stmt : "+ querryString); 

       myDataBase.execSQL(querryString); 

      } catch (SQLException ex) { 
       Log.i("CreateDB Exception ",ex.getMessage()); 
      } 
     } 
     public void insert(Context context,ArrayList<String> array_vals,ArrayList<String> title,String TABLE_NAME) { 
      Log.d("Inside Insert","Insertion starts for table name: "+TABLE_NAME); 
      myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null);   //Opens database in writable mode. 
      String titleString=null; 
      String markString= null; 
      int i; 
      titleString = title.get(0)+","; 
      markString = "?,"; 
      Log.d("**createDynamicDatabase", "in oncreate"); 
      for(i=1;i<title.size()-1;i++) 
      {    
       titleString += title.get(i); 
       titleString +=","; 
       markString += "?,"; 
      } 
      titleString+= title.get(i); 
      markString += "?"; 

      //System.out.println("Title String: "+titleString); 
      //System.out.println("Mark String: "+markString); 


      INSERT="insert into "+ TABLE_NAME + "("+titleString+")"+ "values" +"("+markString+")"; 
      System.out.println("Insert statement: "+INSERT); 
      //System.out.println("Array size iiiiii::: "+array_vals.size()); 
      //this.insertStmt = this.myDataBase.compileStatement(INSERT); 
      int s=0; 

      while(s<array_vals.size()){ 

      System.out.println("Size of array1"+array_vals.size()); 
        //System.out.println("Size of array"+title.size()); 
      int j=1; 
      this.insertStmt = this.myDataBase.compileStatement(INSERT); 
      for(int k =0;k< title.size();k++) 
      { 

       //System.out.println("Value of column "+title+" is "+array_vals.get(k+s)); 
       //System.out.println("PRINT S:"+array_vals.get(k+s)); 
       System.out.println("BindString: insertStmt.bindString("+j+","+ array_vals.get(k+s)+")"); 
       insertStmt.bindString(j, array_vals.get(k+s)); 



       j++; 
      } 

      s+=title.size(); 

      } 
      insertStmt.executeInsert(); 
     } 
+0

매우 유용한 코드. 감사 – Riser