當前位置:首頁 » 數據倉庫 » greendao清空資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

greendao清空資料庫

發布時間: 2023-06-01 10:50:10

『壹』 GreenDao insertOrReplace和save的區別

你好,很高興為你解答

關於GreenDao insertOrReplace和save的區別:

  • insertOrReplace : 傳入的對象在資料庫中,有則更新無則插入。推薦同步資料庫時使用該方法。

  • save 類似於insertOrReplace,區別在於save會判斷傳入對象的key,有key的對象執行更新,無key的執行插入。當對象有key但並不在資料庫時會執行失敗.適用於保存本地列表。

適用場景

  1. 只有本地資料庫,且key默認由資料庫生成。直接使用save就好

  2. 插入的數據有key,其實這種情況通常是同步線上數據到本地資料庫時的情況,因為直接使用了資料庫的key,所以不能使用save,必須使用insertOrReplace。

結論

在確保插入數據有key時必須存在於資料庫的情況下,適用save更高效。其他情況一律適用insertOrReplace

不足之處還望大神指正

『貳』 在Android開發中用GreenDao操作sqlite資料庫後,SQLite資料庫用SQLite Expert Personal無法正常打開

});//alert($('#modifyCustomerForm').validate().form());return$('#modifyCustomerForm').validate().form();},url:"addCustomerAction.action",type:"POST",error:function(){showDialog("error");},success:function(data){$("#dialog").dialog("提示");$("#dialog").text("修改成功");$('#dialog').dialog({modal:true,buttons:{確定:function(){document.location="searchCustomerAction.action?page=1";}

『叄』 android contentprovider 怎麼操作green的資料庫

有時我們需要對文件或資料庫進行測試,但我們又不想破壞應用程序或設備原有的數據。此時我們就需要一個Mock來替代他們,這里的Mock不是android.test.mock,但也是android.test包下面的,RenamingDelegatingContext的類。示例參見:D:\workspace\MockTest*******************MockContextExampleActivity********packagecom.example.mocktest;importjava.io.FileInputStream;importandroid.app.Activity;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.view.Menu;importandroid.widget.TextView;{publicfinalstaticStringFILE_NAME="myfile.txt";privateTextViewmTv;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);mTv=(TextView)findViewById(R.id.text1);finalbyte[]buffer=newbyte[1024];try{finalFileInputStreamfis=openFileInput(FILE_NAME);finalintn=fis.read(buffer);mTv.setText(newString(buffer,0,n-1));}catch(Exceptione){mTv.setText(e.toString());mTv.setTextColor(Color.RED);}}//這里寫了個getText方法,測試工程會用到。publicStringgetText(){returnmTv.getText().toString();}@(Menumenu){//Inflatethemenu;.getMenuInflater().inflate(R.menu.mock_context_example,menu);returntrue;}}*****************MockContextExampleTest*****************packagecom.example.mocktest;importandroid.content.Intent;importandroid.test.ActivityUnitTestCase;importandroid.test.RenamingDelegatingContext;{="test.";;publicMockContextExampleTest(){super(MockContextExampleActivity.class);}@OverrideprotectedvoidsetUp()throwsException{super.setUp();mMockContext=newRenamingDelegatingContext(getInstrumentation().getTargetContext(),PREFIX);mMockContext.();}@OverrideprotectedvoidtearDown()throwsException{super.tearDown();}(){setActivityContext(mMockContext);startActivity(newIntent(),null,null);=getActivity();assertNotNull(mActivity);Stringtext=mActivity.getText();assertEquals("Thisis*MOCK*data",text);}}Notice:別忘了在清單文件里加上RenamingDelegatingContext函數的使用,PREFIX是表示文件或資料庫的前綴。另外這里為什麼使用getTargetContext方法而不是getContext,後者我們經常在UiTest中使用到。這里其實看下注釋就明白了://getContext():Theinstrumentation』spackagecontext.//getTargetContext():.運行下測試,pass。這說明getText方法返回的string已經是Thisis*MOCK*data而不是Thisisrealdata了。這就可以證明,開發沒有寫死這段話。以上就是RenamingDelegatingContext函數如何來mock文件的,資料庫的使用也是一樣的。

『肆』 如何查看green3生成的資料庫

如何查看green3生成的資料庫
:使用 Guid 作為我一個伺服器應用程序中的主鍵,並且想要能夠遠程從 android 設備和上載回伺服器生成新的數據。Android 設備上的資料庫是在 sqlite 中,並使用 greenDAO 來生成 Pojo 和數據訪問

『伍』 Android Green插入10萬條數據OOM

下面寫個小程序測試一下。
private Runnable runnable = new Runnable() { @Override
public void run() {
List<Book> bookList = new ArrayList<>(); for (int i = 0; i < 5000; i++) {
Book book = new Book();
book.setUuid(UUID.randomUUID().toString());
book.setName("name"); //其他set方法略
bookList.add(book);
} try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

mBookDao.insertOrReplaceInTx(bookList);
Log.d(TAG, "插入book數據:" + bookList.size());
}
};private void insert() {
Log.d(TAG, "線程池開始");
mBookDao.deleteAll(); long time = System.currentTimeMillis();
ExecutorService executorService = Executors.newFixedThreadPool(3); for (int i = 0; i < 200; i++) {
executorService.submit(runnable);
}
executorService.shutdown(); for (; ; ) { if (executorService.isTerminated()) { break;
} try {
executorService.awaitTermination(1, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, "線程池完成:" + (System.currentTimeMillis() - time) + "ms");
}

runnable任務模擬1秒從網路拉取5000條數據並插入DB,insert方法使用線程池執行runnable任務。
執行時間超過1000秒,查看內存佔用超過180M。如果數據量更多,肯定會發生OOM,基本上可以定位是greenDAO的問題。現在需要在兩個方面優化,一是尋找內存佔用的原因,二是提高數據的插入速度。
查看內存堆
內存的佔用隨著insert的數據量越多而遞增,從中間mp出java堆,得到hprof文件。注意這個文件不是標准格式,只能用AndroidStudio打開。

圖1
右擊文件導出標準的hprof文件,用更加強大的MAT分析。

圖2

圖3
看到IdentityScope佔了一半內存,可以確定是greenDAO緩存了插入數據。
mBookDao.insertOrReplaceInTx(bookList);mBookDao.detachAll();

greenDAO的緩存功能是有用的,沒必要關閉,改成在插入數據後,調用一次detachAll,將identityScope清空。
public void detachAll() { if (identityScope != null) {
identityScope.clear();
}
}

重建索引
對表插入大量數據,如果中間沒有涉及到業務,可以先失效索引,待插入完成後重建索引。
String sql = "drop index index_isbn";
mDb.execSQL(sql);
sql = "drop index index_publisherid";
mDb.execSQL(sql);
sql = "drop index index_author";
mDb.execSQL(sql);

插入數據前,drop掉表中的索引。沒有見到greenDAO有操作索引的方法,直接執行sql命令。
sql = "create index index_isbn on book(isbn)";
mDb.execSQL(sql);
sql = "create index index_publisherid on book(publisherid)";
mDb.execSQL(sql);
sql = "create index index_author on book(author)";
mDb.execSQL(sql);

插入數據完成後,重建索引。最後執行100w數據插入大約耗時450秒,比什麼都不做快了兩三倍。
非同步操作
上一個步驟的耗時包含了模擬網路和資料庫操作的時間,使用多線程將兩個環節分離,可以減少總時間。
greenDAO提供了AsyncSession這個非同步操作類,使用Session.startAsyncSession()獲取實例,內部實現使用了線程池和阻塞隊列,原理很簡單不用多講。
mAsyncSession.runInTx(new Runnable() { @Override
public void run() {
mBookDao.insertOrReplaceInTx(bookList);
mBookDao.deleteAll();
}
});

獲取數據後,提交給AsyncSession非同步插入資料庫。要注意在合適地方使用waitForCompletion,等待AsyncSession完成已有任務。如果獲取數據速度很快,而操作資料庫很慢,會導致過多數據緩存在AsyncSession的內部阻塞隊列。
最後測試一下100w數據插入資料庫,耗時不到150秒,又快了幾倍。

作者:展翅而飛
鏈接:https://www.jianshu.com/p/6589c6d3f551
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

『陸』 green用完需要手動關閉資料庫嗎

點開green某方法

privatevoiddeleteInTxInternal(Iterable<T>entities,Iterable<K>keys){
//此處打開
db.beginTransaction();
try{
...
}finally{
//此處關閉
db.endTransaction();
}
}

green不需要手動去打開和關閉資料庫,已經幫我們做好了