2012-11-26 70 views
0

使用SQLJet作爲Java項目的SQLite庫時,我爲我的表創建索引並使用它從數據庫中獲取某些內容,並且一直收到錯誤,並且我不知道我做錯了。說了一下我的代碼(我創建了多個表,但他們沒有任何意義。)我該如何解決這個錯誤?找不到創建的索引

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(); 
     } 
    } 
} 

而且,我打電話給我的getContact方法

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

您使用您創建的索引相同的用戶或者你使用其他用戶從您的應用程序?
如果您使用其他用戶,則看起來用戶沒有權限訪問和使用索引。然後允許應用程序用戶使用索引。

+0

這一切都在同一個正在運行的應用程序中完成,並且據我所知,數據庫正在被單個用戶使用。每一個不使用索引的寫/讀方法都可以工作。 – user1810737