首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AndroidAnnotations和ORMLite获取AndroidAnnotations和ORMLite

用AndroidAnnotations和ORMLite获取AndroidAnnotations和ORMLite
EN

Stack Overflow用户
提问于 2016-02-12 22:28:41
回答 1查看 1.5K关注 0票数 0

我正在使用AndroidAnnotations和SQLite与ORMLite,并试图使数据库的建立和运行。几天前,我创建了这个表并对一个联系人对象进行了测试-插入。然而,我做了一些更改,然后它停止工作-不幸的是,我无法恢复我的变化,现在我被困,不能让它继续工作。

每当我启动应用程序时,我都会得到以下错误:

代码语言:javascript
复制
02-12 23:09:39.931 11766-11766/net.gazeapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: net.gazeapp, PID: 11766
java.lang.RuntimeException: Unable to start activity ComponentInfo{net.gazeapp/net.gazeapp.MainActivity_}: java.lang.NullPointerException: Attempt to invoke virtual method 'int net.gazeapp.data.ContactDao.create(java.lang.Object)' on a null object reference
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
 at android.app.ActivityThread.-wrap11(ActivityThread.java)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:148)
 at android.app.ActivityThread.main(ActivityThread.java:5417)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int net.gazeapp.data.ContactDao.create(java.lang.Object)' on a null object reference
 at net.gazeapp.service.ContactService.addContact(ContactService.java:55)
 at net.gazeapp.MainActivity.testNewORM(MainActivity.java:171)
 at net.gazeapp.MainActivity.createView(MainActivity.java:148)
 at net.gazeapp.MainActivity_.onViewChanged(MainActivity_.java:111)
 at org.androidannotations.api.view.OnViewChangedNotifier.notifyViewChanged(OnViewChangedNotifier.java:41)
 at net.gazeapp.MainActivity_.setContentView(MainActivity_.java:57)
 at net.gazeapp.MainActivity_.onCreate(MainActivity_.java:45)
 at android.app.Activity.performCreate(Activity.java:6251)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
 at android.app.ActivityThread.-wrap11(ActivityThread.java) 
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
 at android.os.Handler.dispatchMessage(Handler.java:102) 
 at android.os.Looper.loop(Looper.java:148) 
 at android.app.ActivityThread.main(ActivityThread.java:5417) 
 at java.lang.reflect.Method.invoke(Native Method) 
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

下面是我的MainActivity,我在其中执行ORM测试(在testNewORM()方法中):

代码语言:javascript
复制
@EActivity(R.layout.activity_main_viewpagertab)
@OptionsMenu(R.menu.menu_main)
public class MainActivity extends BaseActivity implements ObservableScrollViewCallbacks {

    private final String TAG = getClass().getSimpleName();

    private int mBaseTranslationY;
    private NavigationAdapter mPagerAdapter;
    private Contact mContact;

    private static String[] tabTitles = null;

    @App
    GazeApplication application;

    @ViewById(R.id.header)
    View mHeaderView;

    @ViewById(R.id.toolbar)
    View mToolbarView;

    @ViewById(R.id.pager)
    ViewPager mPager;

    @ViewById(R.id.fab)
    FloatingActionButton fab;

    @ViewById(R.id.adview)
    MoPubView mAdView;

    @Bean
    ContactService contactService;

    @AfterViews
    void createView() {
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));

        Tools.readJsonFile(this, "fetishes.json");

        // TAB TITLES: RECENT, ALL, MY MEDIA
        tabTitles = new String[]{getString(R.string.recent), getString(R.string.all), getString(R.string.my_media)};

        ViewCompat.setElevation(mHeaderView, getResources().getDimension(R.dimen.toolbar_elevation));

        mPagerAdapter = new NavigationAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);

        SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
        slidingTabLayout.setCustomTabView(R.layout.tab_indicator, android.R.id.text1);
        slidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.colorAccent));
        slidingTabLayout.setDistributeEvenly(true);
        slidingTabLayout.setViewPager(mPager);

        // When the page is selected, other fragments' scrollY should be adjusted
        // according to the toolbar status(shown/hidden)
        slidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {
            }

            @Override
            public void onPageSelected(int i) {
                propagateToolbarState(toolbarIsShown());
            }

            @Override
            public void onPageScrollStateChanged(int i) {
            }
        });

        propagateToolbarState(toolbarIsShown());

        displayAdBanner();

        // TESTING ORMAPPER
        // TESTING ORMAPPER
        testNewORM();
    }

    void testNewORM() {
        java.util.Date date = new java.util.Date();
        Timestamp timeNow = new Timestamp(date.getTime());

        Timestamp birthdateTimestamp = new Timestamp(date.getTime());
        Date birthdate = new Date();

        try {
            DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            birthdate = dateFormat.parse("04/07/1980");
            long time = birthdate.getTime();
            birthdateTimestamp = new Timestamp(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        Contact contact = new Contact("Dominik Erbsland");
        contact.setBirthdate(birthdate);

        try {
            mContact = contactService.addContact(contact);
        } catch (ItemNotFoundException | SQLException e) {
            Log.e(TAG, e.getLocalizedMessage());
            e.printStackTrace();
        }
    }

...
}

在这里,其他用过的类:

代码语言:javascript
复制
@EBean(scope = EBean.Scope.Singleton)
public class ContactService {

    private static final String TAG = ContactService.class.getSimpleName();

    @RootContext
    Context ctx;

    @OrmLiteDao(helper = DatabaseHelper.class)
    ContactDao mContactDao;

    public Contact getContact(int contactId) throws ItemNotFoundException, SQLException {
        Contact contact = mContactDao.queryForId(contactId);
        if (contact == null) {
            Log.e(TAG, "Contact not found in database");
            throw new ItemNotFoundException();
        }

        return contact;
    }

    public List<Contact> getContacts() throws ItemNotFoundException, SQLException {
        List<Contact> contact = mContactDao.queryForAll();
        if (contact == null) {
            Log.e(TAG, "Contacts not found in database");
            throw new ItemNotFoundException();
        }

        return contact;
    }

    public Contact addContact(Contact contact) throws SQLException {
        int rowsAffected = 0;
        try {
            rowsAffected = mContactDao.create(contact);
        } catch (SQLException e) {
            Log.e(TAG, e.getLocalizedMessage());
            e.printStackTrace();
        }

        Log.d(TAG, "New Contact ID: " + contact.getId());

        return contact;
    }

    public void testOutput() {
        Log.d(TAG, "THIS IS A TEST OUTPUT");
    }

}

在这里,我的数据库助手:

代码语言:javascript
复制
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

    private static final String DATABASE_NAME = "Gaze.db";
    private static final int DATABASE_VERSION = 1;
    private final Context context;

    // the DAO object we use to access the Person table
    private Dao<Contact, Integer> contactDao = null;
    private Dao<MyPreferences, Integer> preferencesDao = null;
    private Dao<SecurityQuestion, Integer> securityQuestionDao = null;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    /**
     * This is called when the database is first created. Usually you should call createTable statements here to create
     * the tables that will store your data.
     */
    @Override
    public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
        try {
            Log.i(DatabaseHelper.class.getName(), "onCreate");

            TableUtils.createTable(connectionSource, Contact.class);
        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't create database", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * This is called when your application is upgraded and it has a higher version number. This allows you to adjust
     * the various data to match the new version number.
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        try {
            Log.i(DatabaseHelper.class.getName(), "onUpgrade");
            TableUtils.dropTable(connectionSource, Contact.class, true);
            // after we drop the old databases, we create the new ones
            onCreate(db, connectionSource);
        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * Returns the Database Access Object (DAO) for our Person class. It will create it or just give the cached
     * value.
     */
    public Dao<Contact, Integer> getContactDao() throws SQLException {
        if (contactDao == null) {
            contactDao = getDao(Contact.class);
        }
        return contactDao;
    }

    public Dao<MyPreferences, Integer> getPreferencesDao() throws SQLException {
        if (preferencesDao == null) {
            preferencesDao = getDao(MyPreferences.class);
        }
        return preferencesDao;
    }

    public Dao<SecurityQuestion, Integer> getSecurityQuestionDao() throws SQLException {
        if (securityQuestionDao == null) {
            securityQuestionDao = getDao(SecurityQuestion.class);
        }
        return securityQuestionDao;
    }

    /**
     * Close the database connections and clear any cached DAOs.
     */
    @Override
    public void close() {
        super.close();
        contactDao = null;
        preferencesDao = null;
        securityQuestionDao = null;
    }   
}                                                              

数据类:

代码语言:javascript
复制
@DatabaseTable(tableName = "Contact", daoClass = ContactDao.class)
public class Contact implements Serializable {

    @DatabaseField(generatedId = true, columnName = PersistentObject.ID)
    int id;

    @DatabaseField(index = true)
    String contactName;

    @DatabaseField
    String mainPic;

    @DatabaseField(dataType = DataType.DATE_STRING, format = "yyyy-MM-dd HH:mm:ss.S")
    Date birthdate;

    @DatabaseField
    boolean knowPersonally;

    @DatabaseField(dataType = DataType.DATE_STRING, format = "yyyy-MM-dd HH:mm:ss.S")
    Timestamp created;

    @DatabaseField(dataType = DataType.DATE_STRING, format = "yyyy-MM-dd HH:mm:ss.S")
    Timestamp lastMod;

    public Contact() {
        // needed by ormlite
    }

...
}   

ContactDao:

代码语言:javascript
复制
public class ContactDao extends BaseDaoImpl<Contact, Integer> {

    public ContactDao(Class<Contact> dataClass) throws SQLException {
        super(dataClass);
    }

    public ContactDao(ConnectionSource connectionSource, Class<Contact> dataClass) throws SQLException {
        super(connectionSource, dataClass);
    }

    public ContactDao(ConnectionSource connectionSource, DatabaseTableConfig<Contact> tableConfig) throws SQLException {
        super(connectionSource, tableConfig);
    }

    public List<Contact> getContacts() throws SQLException {
        return queryForAll();
    }

}

因此,在ContactService类"mContactDao.create(contact);“中,它异常崩溃。这是我不明白的部分,因为ContactService是用@EBean注释的,并且是用"@Bean ContactService contactService“在MainActivity中访问的;而且不应该是空的.

谢谢你提前提供帮助或暗示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-14 10:24:25

问题如下:

代码试图访问mContactDao字段,但它确实是null,尽管AndroidAnnotations应该注入它。但是不能注入字段,因为道创建失败了。这是由AndroidAnnotations记录的,您可以在LogCat中检查它。

问题的原因在于Contact类。您正在使用List<Something>字段,但是ORMLite不知道如何持久化java.util.List对象。您可以使用自定义持久器,也可以使用外域:

Contact.java:

代码语言:javascript
复制
@ForeignCollectionField
private ForeignCollection<Address> adresses;

更新:

应用ForestCollectionField更改和调试再次显示了另一个问题。DataType.DATE_STRING持久器不能与java.sql.Timestamp类一起使用。但是您可以使用DataType.TIME_STAMP来代替:

代码语言:javascript
复制
@DatabaseField(dataType = DataType.TIME_STAMP, format = "yyyy-MM-dd HH:mm:ss.S")
Timestamp created;

@DatabaseField(dataType = DataType.TIME_STAMP, format = "yyyy-MM-dd HH:mm:ss.S")
Timestamp lastMod;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35373303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档