2013-08-10 1 views
0

작업중인 응용 프로그램이 .xml 파일의 데이터를 성공적으로 구문 분석하여 데이터베이스에 저장합니다. 그러나 각 응용 프로그램이 시작될 때 구문 분석 된 데이터가 저장된 테이블 행 수만큼 데이터베이스의 크기가 커집니다. 예를 들어 구문 분석 된 데이터가 저장하기 위해 3 개의 행을 사용하면 각 후속 응용 프로그램을 실행하면 데이터베이스가 6 개, 9 개, 12 개 등의 크기로 증가합니다.XML을 SQLite 데이터베이스로 구문 분석 할 때 문제가 발생했습니다.

내가 원하는 것은 테이블이 각 응용 프로그램을 시작할 때 증가하지 않도록하는 것입니다. 매번 데이터베이스를 재설정하려고 시도했지만 올바르게 처리하는 방법이나 이것이 해결해야 할 솔루션인지 확실하지 않습니다.

나는 그것의 전체 데이터베이스를 표시 할 뷰를 가지고 :

public class QAView extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.qa_view); 

     TextView tv = (TextView) findViewById(R.id.tvData); 
     QADatabase entries = new QADatabase(this); 
     try 
     { 
      entries.open(); 
      String data = entries.getAllData(); 
      tv.setText(data); 
      entries.close(); 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

나는 .xml 파일에서 데이터를 처리하는 파서 코드가 있습니다 또한

XmlResourceParser parser = getResources().getXml(R.xml.qa); 

    try 
    { 
     while(parser.next() != XmlPullParser.END_DOCUMENT) 
     { 
      if(parser.getEventType() != XmlPullParser.START_TAG) 
      { 
       continue; 
      } 

      String name = parser.getName(); 

      if(name.equals("question")) 
      { 
       question = readTextQuestion(parser); 
      } 
      else if(name.equals("options")) 
      { 
       readTextAnswers(parser); 
      } 
     } 
    } 
    catch(XmlPullParserException e) 
    { 
     e.printStackTrace(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 

I을 해당 데이터베이스 코드가 있습니다 :

public class QADatabase 
{ 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_QUESTION = "question"; 
    public static final String KEY_ANSWER1 = "answer1"; 
    public static final String KEY_ANSWER2 = "answer2"; 
    public static final String KEY_ANSWER3 = "answer3"; 
    public static final String KEY_ANSWER4 = "answer4"; 
    public static final String KEY_ANSWER5 = "answer5"; 
    public static final String KEY_CORRECT = "correct"; 

    public static final String DATABASE_NAME = "QuestionAnswerDatabase"; 
    public static final String DATABASE_TABLE = "QuestionAnswerTable"; 
    public static final int DATABASE_VERSION = 2; 

    private DatabaseHelper ourHelper; 
    private final Context ourContext; 
    private SQLiteDatabase ourDatabase; 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     private DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase sqLiteDatabase) 
     { 
      sqLiteDatabase.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
        KEY_ROWID + " INTEGER PRIMARY KEY, " + 
        KEY_QUESTION + " TEXT NOT NULL, " + 
        KEY_ANSWER1 + " TEXT NOT NULL, " + 
        KEY_ANSWER2 + " TEXT NOT NULL, " + 
        KEY_ANSWER3 + " TEXT NOT NULL, " + 
        KEY_ANSWER4 + " TEXT NOT NULL, " + 
        KEY_ANSWER5 + " TEXT NOT NULL, " + 
        KEY_CORRECT + " TEXT NOT NULL);" 
      ); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) 
     { 
      sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(sqLiteDatabase); 
     } 
    } 

    public QADatabase(Context c) 
    { 
     ourContext = c; 
    } 

    public QADatabase open() throws SQLException 
    { 
     ourHelper = new DatabaseHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 

    public void close() 
    { 
     ourHelper.close(); 
    } 

    public void createEntry(String question, String answer1, String answer2, String answer3, String answer4, String answer5, String correct) 
    { 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_QUESTION, question); 
     cv.put(KEY_ANSWER1, answer1); 
     cv.put(KEY_ANSWER2, answer2); 
     cv.put(KEY_ANSWER3, answer3); 
     cv.put(KEY_ANSWER4, answer4); 
     cv.put(KEY_ANSWER5, answer5); 
     cv.put(KEY_CORRECT, correct); 
     ourDatabase.insert(DATABASE_TABLE, null, cv); 
    } 

    public String getAllData() 
    { 
     String[] columns = new String[] {KEY_ROWID, KEY_QUESTION, KEY_ANSWER1, KEY_ANSWER2, KEY_ANSWER3, KEY_ANSWER4, KEY_ANSWER5, KEY_CORRECT}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
     String result = ""; 

     while(c.moveToNext()) 
     { 
      result = result + c.getString(0) + " " + c.getString(1) + " " + c.getString(2) + " " + c.getString(3) + " " + c.getString(4) + " " + c.getString(5) + " " + c.getString(6) + " " + c.getString(7) + "\n"; 
     } 

     return result; 
    } 

    public String getQuestion(long l) throws SQLException 
    { 
     String[] columns = new String[] {KEY_ROWID, KEY_QUESTION, KEY_ANSWER1, KEY_ANSWER2, KEY_ANSWER3, KEY_ANSWER4, KEY_ANSWER5, KEY_CORRECT}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null); 

     if(c != null) 
     { 
      // move the cursor to the first row 
      c.moveToFirst(); 

      // look for ID "l" in the "Questions" column 
      String question = c.getString(1); 

      return question; 
     } 

     // otherwise, return null 
     return null; 
    } 

    public String getAnswerChoice(long l, int answerChoiceNumber) throws SQLException 
    { 
     String[] columns = new String[] {KEY_ROWID, KEY_QUESTION, KEY_ANSWER1, KEY_ANSWER2, KEY_ANSWER3, KEY_ANSWER4, KEY_ANSWER5, KEY_CORRECT}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null); 

     if(c != null) 
     { 
      // move the cursor to the first row 
      c.moveToFirst(); 

      // look for ID "l" in the "Answers" column 
      String correctAnswer = c.getString(answerChoiceNumber + 2); // need to offset by 2 for the KEY_ROWID and KEY_QUESTION columns 

      return correctAnswer; 
     } 

     // otherwise, return null 
     return null; 
    } 

    public Cursor getAllTitles() 
    { 
     return ourDatabase.query(DATABASE_TABLE, new String[] { 
       KEY_ROWID, KEY_ANSWER1, KEY_ANSWER2, KEY_ANSWER3, KEY_ANSWER4, KEY_ANSWER5, KEY_CORRECT}, 
       null, null, null, null, null); 
    } 

답변

0

고정 된 주 ID (rowID)를 각 질문에 할당 할 수 있으므로 반복해서 반복하면 기본 키 제약 조건 예외가 중복되어 테이블이 커지지 않습니다.

관련 문제