2012-11-26 3 views
0

Java 프로젝트 용 SQLite 라이브러리로 SQLJet을 사용하여 테이블에 대한 인덱스를 생성하고이를 사용하여 데이터베이스에서 무언가를 얻습니다. 그리고 계속 오류가 발생하고 있습니다. 잘못하고있어. 내가 작성한 코드를 조금 바꿔서 (하나 이상의 테이블을 만들었지 만 별 의미가 없습니다.) 어떻게이 오류를 수정합니까?생성 된 인덱스를 찾을 수 없습니다

org.tmatesoft.sqljet.core.SqlJetException: Index not exists: FULL_NAME_INDEX: error code is MISUSE 
    at org.tmatesoft.sqljet.core.internal.table.SqlJetTable.checkIndexName(SqlJetTable.java:285) 
    at org.tmatesoft.sqljet.core.internal.table.SqlJetTable.access$300(SqlJetTable.java:46) 
    at org.tmatesoft.sqljet.core.internal.table.SqlJetTable$2.runWithLock(SqlJetTable.java:149) 
    at org.tmatesoft.sqljet.core.table.SqlJetDb$1.runSynchronized(SqlJetDb.java:172) 
    at org.tmatesoft.sqljet.core.table.engine.SqlJetEngine.runSynchronized(SqlJetEngine.java:217) 
    at org.tmatesoft.sqljet.core.table.SqlJetDb.runWithLock(SqlJetDb.java:170) 
    at org.tmatesoft.sqljet.core.internal.table.SqlJetTable.lookup(SqlJetTable.java:146) 
    at eureqapp.DatabaseManager.getContact(DatabaseManager.java:408) 

내 코드 :

public DatabaseManager() throws SqlJetException, IOException 
{ 
    try 
    { 
     //Creates a database file, if it doesn't exist already. 
     File dbFile = new File(databaseFileName); 
     if (!dbFile.exists()) 
     { 
      dbFile.createNewFile(); 

      db = SqlJetDb.open(dbFile, true); 
      db.beginTransaction(SqlJetTransactionMode.WRITE); 
      db.getOptions().setUserVersion(1); 
      createTables(); 

     } else 
     { 
      db = SqlJetDb.open(dbFile, true); 
      db.beginTransaction(SqlJetTransactionMode.WRITE); 
      db.getOptions().setUserVersion(1); 
     } 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } finally 
    { 

     if (db.isOpen()) 
     { 
      db.commit(); 
      db.close(); 
     } 
    } 
} 

public static void createTables() throws SqlJetException 
{ 
    try 
    { 
     if (!db.isOpen()) 
     { 
      db.open(); 
     } 

     db.beginTransaction(SqlJetTransactionMode.WRITE); 
     db.createTable(CREATE_TABLE_CONTACT); 
     db.createIndex(CREATE_CONTACT_NAME_INDEX); 



    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } finally 
    { 

     if (db.isOpen()) 
     { 
      db.commit(); 
      db.close(); 
     } 
    } 
} 

은 내가

public static Contact getContact(String name) throws SqlJetException 
{ 
    Contact c = new Contact(); 

    try 
    { 
     if (!db.isOpen()) 
     { 
      db.open(); 
     } 
     db.beginTransaction(SqlJetTransactionMode.READ_ONLY); 

     ISqlJetTable table = db.getTable("CONTACT"); 
     ISqlJetCursor cursor = table.lookup("FULL_NAME_INDEX", name); 

     String contactName = cursor.getString("name"); 
     String contactAddress = cursor.getString("address"); 
     String contactPlace = cursor.getString("place"); 
     String contactDepartment = cursor.getString("department"); 
     String contactTelephone = cursor.getString("telephone_number"); 
     String contactMobile = cursor.getString("mobile_number"); 
     String contactEmail = cursor.getString("email_address"); 
     cursor.close(); 
     db.close(); 

     c = new Contact(contactName, contactAddress, contactPlace, contactDepartment, contactTelephone, contactMobile, contactEmail); 

     return c; 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return null; 
} 

답변

0

은 당신이 당신의 색인을 생성 한 동일한 사용자를 사용하거나 응용 프로그램에서 다른 사용자를 사용합니까 내 getContact 같은 메서드를 호출 할 경우 ?
다른 사용자를 사용하는 경우 사용자가 색인에 액세스하여 사용할 수있는 권한이없는 것처럼 보입니다. 그런 다음 응용 프로그램 사용자가 색인을 사용할 수있게하십시오.

+0

이것은 모두 동일한 실행 응용 프로그램 내에서 수행되며 데이터베이스가 단일 사용자에 의해 사용되는 것으로 알고 있습니다. 인덱스를 사용하지 않는 다른 모든 쓰기/읽기 메소드는 작동합니다. – user1810737

관련 문제