2015-10-05 98 views
3

我遇到了我的數據庫問題。應用程序發送用戶寫的鏈接,並作爲迴應得到鏈接的簡短形式(工作正常)。在我的數據庫中,我需要把這兩個版本的鏈接 - 完整的,簡短的一個,在這裏我們有一個問題。我得到這樣的錯誤:dbhelper,ORMLite和碎片問題

java.lang.IllegalStateException: Could not construct instance of helper class class pl.bartos.task.DatabaseHelper 
      at com.j256.ormlite.android.apptools.OpenHelperManager.constructHelper(OpenHelperManager.java:222) 
      at com.j256.ormlite.android.apptools.OpenHelperManager.loadHelper(OpenHelperManager.java:170) 
      at com.j256.ormlite.android.apptools.OpenHelperManager.getHelper(OpenHelperManager.java:78) 
      at pl.bartos.task.Fragments2.getHelper(Fragments2.java:35) 
      at pl.bartos.task.Fragments2.onCreateView(Fragments2.java:56) 

這是我的第一個ORMLite應用程序,所以我有點困惑。

這裏是我的fragments2.class:

public class Fragments2 extends SherlockFragment { 


private ListView linkListView; 
private Dao<Link, Integer> linkDao; 
private List<Link> linkList = new ArrayList(); 

private DatabaseHelper getHelper() { 
    if (databaseHelper == null) { 
     databaseHelper = OpenHelperManager.getHelper(getActivity(), DatabaseHelper.class); 
    } 
    return databaseHelper; 
} 

private DatabaseHelper databaseHelper = null; 


public Fragments2() { 
} 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle 
     savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment2, container, false); 
    linkListView = (ListView) rootView.findViewById(R.id.link_lv); 

    try { 
     linkDao = getHelper().getLinkDao(); 
     linkList = linkDao.queryForAll(); 
     final View rowView = inflater.inflate(R.layout.link_item, linkListView, false); 
     linkListView.addHeaderView(rowView); 
     linkListView.setAdapter(new LinkAdapter(getActivity(), R.layout.link_item, linkList, linkDao)); 
     populateNoRecordMsg(); 


    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return rootView; 
} 
private void populateNoRecordMsg() 
{ 
    // If, no record found in the database, appropriate message needs to be displayed. 
    if(linkList.size() == 0) 
    { 
     final TextView tv = new TextView(getActivity()); 
     tv.setPadding(5, 5, 5, 5); 
     tv.setTextSize(15); 
     tv.setText("No Record Found !!"); 
     linkListView.addFooterView(tv); 
    } 
} 


@Override 
public void onDetach() { 
    super.onDetach(); 
    try { 
     Field childFragmentManager = Fragment.class 
       .getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    if (databaseHelper != null) { 
     OpenHelperManager.releaseHelper(); 
     databaseHelper = null; 
    } 

} 

}

這裏是我的DatabaseHelper類

public class DatabaseHelper extends OrmLiteSqliteOpenHelper { 

private static final String DATABASE_NAME = "link.db"; 
private static final int DATABASE_VERSION = 1; 
private Dao<Link, Integer> linkDao; 

public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION, R.raw.ormlite_config); 
} 
@Override 
public void onCreate(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource) { 
    try { 
     TableUtils.createTable(connectionSource, Link.class); 

    } catch (SQLException e) { 
     Log.e(DatabaseHelper.class.getName(), "Unable to create database", e); 
    } 
} 
@Override 
public void onUpgrade(SQLiteDatabase sqliteDatabase, ConnectionSource connectionSource, int oldVer, int newVer) { 
    try { 

     // In case of change in database of next version of application, please increase the value of DATABASE_VERSION variable, then this method will be invoked 
     //automatically. Developer needs to handle the upgrade logic here, i.e. create a new table or a new column to an existing table, take the backups of the 
     // existing database etc. 

     TableUtils.dropTable(connectionSource, Link.class, true); 
     onCreate(sqliteDatabase, connectionSource); 

    } catch (SQLException e) { 
     Log.e(DatabaseHelper.class.getName(), "Unable to upgrade database from version " + oldVer + " to new " 
       + newVer, e); 
    } 
} 
public Dao<Link, Integer> getLinkDao() throws SQLException { 
    if (linkDao == null) { 
     linkDao = getDao(Link.class); 
    } 
    return linkDao; 
} 

}

這是我的適配器

public class LinkAdapter extends ArrayAdapter<String> { 

private LayoutInflater inflater; 
private List records; 
private Dao<Link, Integer> linkDao; 
private Context context; 


public LinkAdapter(Context context, int resource, List objects, Dao<Link, Integer> linkDao) { 
    super(context, resource, objects); 

    this.records = objects; 
    this.linkDao = linkDao; 


} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null) 
     convertView = inflater.inflate(R.layout.link_item, parent, false); 
    if(records.get(position).getClass().isInstance(new Link())){ 
     final Link link = (Link) records.get(position); 
     ((TextView)convertView.findViewById(R.id.entered_tv)).setText(link.getLongLink()); 
     ((TextView)convertView.findViewById(R.id.short_tv)).setText(link.getShortLink()); 
    } 
    return convertView; 
    } 
} 

請幫助:/

回答

3

我知道這是相當晚了,但我剛剛遇到這個問題,一個小時後,「嘗試和失敗」 bug修復我的工作了。

重新制作ormlite-config.txt的問題。您的項目中應該有類似的課程來完成該任務。

例子:

public class DatabaseConfigUtil extends OrmLiteConfigUtil { 

private static final Class<?>[] classes = new Class[] { 
     Notification.class, Message.class, LocationWrapper.class 
}; 

public static void main(String[] args) throws SQLException, IOException { 
    // Provide the name of .txt file which you have already created and kept in res/raw directory 
    writeConfigFile("ormlite_config.txt", classes); 
} 

}

+0

'main'沒有得到我的應用程序被調用。爲什麼? –

+1

你是什麼意思'重新制作ormlite-config.txt固定問題?我的應用程序中有同樣的課程。 –

+0

只需從DatabaseConfigUtil運行主函數...它會使新的ormlite-config.txt :) –