2015-10-05 138 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 :) –