`

android 数据库同步

 
阅读更多
package org.jerry;

import org.hwq.dbutil.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {
	private TextView info;
	private Button runWrongBtn;
	private Button runRightBtn;
	private Button showInfoBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        holdUIComponents();
        showInfo();
    }

	private void holdUIComponents() {
		info = (TextView) findViewById(R.id.info);
		runWrongBtn = (Button) findViewById(R.id.runWrongBtn);
		runRightBtn = (Button) findViewById(R.id.runRightBtn);
		showInfoBtn = (Button) findViewById(R.id.showInfoBtn);
		
		runWrongBtn.setOnClickListener(this);
		runRightBtn.setOnClickListener(this);
		showInfoBtn.setOnClickListener(this);
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.runWrongBtn:
			runWrong();
			break;
		case R.id.runRightBtn:
			runRight();
			break;
		case R.id.showInfoBtn:
			showInfo();
			break;
		}
	}

	private void runWrong() {
		//因为不同步,会导致异常:database is locked
		RunWrongThread t0 = new RunWrongThread();
		RunWrongThread t1 = new RunWrongThread();
		
		t0.start();
		t1.start();
		
		try {
			t0.join();
			t1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		showInfo();
	}
	
	private void runRight() {
		//有同步,执行正常
		RunRightThread t0 = new RunRightThread();
		RunRightThread t1 = new RunRightThread();
		
		t0.start();
		t1.start();
		
		try {
			t0.join();
			t1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		showInfo();
	}
	
	private void showInfo() {
		int userNums = DBUtil.getUserNums(getApplicationContext());
		info.setText(Integer.toString(userNums));
	}
	
	class RunWrongThread extends Thread {
		
		@Override
		public void run() {
			DBOpenHelper dbHelper = new DBOpenHelper(getApplicationContext());
			
			for (int i = 0; i < 100; i++) {
				User user = new User();
				user.setName("name" + i);
				user.setAge(i);
				user.setEmail("email" + i);

				dbHelper.insert(user);
			}
			
			dbHelper.close();
		}
		
	}
	
	class RunRightThread extends Thread {

		@Override
		public void run() {
			for (int i = 0; i < 100; i++) {
				User user = new User();
				user.setName("name" + i);
				user.setAge(i);
				user.setEmail("email" + i);

				DBUtil.insertUser(getApplicationContext(), user);
			}
			
			DBUtil.close();
		}
		
	}
}


package org.jerry;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper{
	private static final String DB_NAME = "db";
	private static final int DB_VERSION = 1;
	
	private static final String T_USER = "t_user";
	private static final String T_USER_COLUMN_ID = "id";
	private static final String T_USER_COLUMN_NAME = "name";
	private static final String T_USER_COLUMN_AGE = "age";
	private static final String T_USER_COLUMN_EMAIL = "email";
	private static final String T_USER_SQL = "create table " + T_USER + " (" + T_USER_COLUMN_ID + " integer primary key autoincrement, " + T_USER_COLUMN_NAME + " text, " + T_USER_COLUMN_AGE + " integer, " + T_USER_COLUMN_EMAIL + " text)";
	
	public DBOpenHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(T_USER_SQL);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}
	
	public void insert(User user) {
		if (user == null) {
			return;
		}
		
		final ContentValues values = new ContentValues();
		values.put(T_USER_COLUMN_NAME, user.getName());
		values.put(T_USER_COLUMN_AGE, user.getAge());
		values.put(T_USER_COLUMN_EMAIL, user.getEmail());
		
		final SQLiteDatabase db = getWritableDatabase();
		db.insert(T_USER, null, values);
	}
	
	public int getUserNums() {
		final SQLiteDatabase db = getReadableDatabase();
		final Cursor cursor = db.query(T_USER, null, null, null, null, null, null);
		
		if (cursor == null) {
			return 0;
		}
		
		int count = cursor.getCount();
		cursor.close();
		
		return count;
	}
}


package org.jerry;

import android.content.Context;

public class DBUtil {
	private static DBOpenHelper dbHelper;
	
	private static void ensureDBHelperExist(Context context) {
		if (dbHelper == null) {
			dbHelper = new DBOpenHelper(context);
		}
	}
	
	/**
	 * 插入user
	 * @param context 务必使用ApplicationContext,直接使用activity/service的context可能导致内存泄露
	 * @param user
	 */
	public synchronized static void insertUser(Context context, User user) {
		ensureDBHelperExist(context);
		dbHelper.insert(user);
	}
	
	/**
	 * @param context 务必使用ApplicationContext,直接使用activity/service的context可能导致内存泄露
	 * @return
	 */
	public synchronized static int getUserNums(Context context) {
		ensureDBHelperExist(context);
		return dbHelper.getUserNums();
	}
	
	public synchronized static void close() {
		if (dbHelper != null) {
			dbHelper.close();
			dbHelper = null;
		}
	}
}
分享到:
评论

相关推荐

    an_mysql.rar_ android Mysql_Android 数据库_Android数据库_MYSQL_android

    标题中的"an_mysql.rar_ android Mysql_Android 数据库_Android数据库_MYSQL_android"表明这是一个关于Android应用程序与MySQL数据库交互的资源包。描述指出在Android设备上实现与MySQL数据库的连接时,需要确保设备...

    你想要Android数据库操作精华(安全、并发、单例等)

    本Demo——"你想要的Android数据库操作精华(安全、并发、单例等)",旨在深入探讨如何在Android Studio环境下进行高效且安全的数据库操作,包括使用数据库框架、数据库加密、并发控制以及单例模式的应用。...

    android_blog.zip_Android 数据库_Android数据库_android_mysql客户端_服务器 数据库

    本项目"android_blog.zip"显然是一个关于Android数据库实现的示例,其中包含了服务器端和客户端的完整代码,且使用了MySQL作为后端数据库。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它在服务器端...

    android-follow-server.zip_Android 同步_Android 数据库_Follow_ Follow_

    在Android开发中,数据同步是一项重要的任务,尤其是在网络应用中,保持手机客户端的数据与服务器数据库同步至关重要。"android-follow-server.zip"这个压缩包文件显然包含了关于实现这一目标的相关资源。让我们详细...

    Delphi XE7 Android平台与PC端同步SQLite 数据库

    要实现Android和PC之间的SQLite数据库同步,我们需要解决以下几个关键问题: 1. **数据传输**:首先,需要一个可靠的通信机制来传递数据,这通常可以通过HTTP、WebSocket或FTP等网络协议实现。在Delphi XE7中,我们...

    Android-一个用于调试android数据库和sharedpreferences的库

    **Android数据库调试** 在Android开发中,SQLite数据库是最常见的本地数据存储方式。通常,开发者需要通过adb命令行工具或者使用像Android Studio这样的IDE内置功能来查看和操作SQLite数据库。然而,`Android-Debug...

    Android数据库Demo-GreenDaoTest.zip

    这个"Android数据库Demo-GreenDaoTest.zip"是一个演示如何使用GreenDao的实例,通过分析这个Demo,我们可以深入理解GreenDao的用法和优势。 首先,GreenDao的核心思想是将Java对象映射到SQLite数据库中的表格,这样...

    Android 三方数据库ObjectBox使用

    3. **实时数据**:ObjectBox支持实时数据同步,一旦数据发生变化,应用程序可以立即获取到更新,无需手动刷新。 4. **多线程支持**:ObjectBox允许在多个线程中并发地读写数据,提高了应用的并发性能。 5. **内存...

    android系统数据库管理工具SQLiteExpertSetup.zip

    10. **同步与版本控制**:与版本控制系统集成,跟踪数据库结构的变更,便于团队协作。 在Android开发中,熟悉并掌握SQLite数据库管理工具是非常重要的技能。通过SQLiteExpert,开发者可以更加专注于业务逻辑的实现...

    Android数据库框架GreenDao封装使用,易理解、易扩展

    在Android应用开发中,数据库操作是一项重要的任务,用于存储和检索数据。GreenDao是一个流行的ORM(对象关系映射)框架,它使得Java对象与SQLite数据库之间的交互变得简单易行。本资源提供了一份关于如何封装和使用...

    Android 数据库自定义日历签到

    综上所述,实现“Android 数据库自定义日历签到”涉及多个方面,包括数据库设计、自定义视图绘制、事件监听、数据同步、UI更新以及性能优化等。通过熟练掌握这些知识点,开发者可以构建出高效、易用的日历签到应用。

    简单的android 数据库注册

    通过以上步骤,你可以实现一个简单的Android数据库注册和登录功能。不过,这只是基础,实际应用中还可能涉及到数据持久化、网络同步、多线程等更复杂的问题。随着技术的深入,你可以进一步学习和掌握这些高级概念。

    android 各种数据库框架使用的Demo

    4. Realm: Realm是一个跨平台的数据库,提供了比SQLite更现代的API,支持实时数据同步。在Android上, Realm 提供了易于使用的对象模型,无需SQL知识即可进行数据操作。此外,Realm还具有内存优化和强大的数据持久...

    Android数据库Sqlite的基本用法及升级策略

    **Android数据库SQLite的基本用法** SQLite是Android系统中默认的轻量级数据库,它支持标准的关系型数据库操作,如创建、查询、更新和删除数据。SQLite数据库文件存储在应用程序的私有目录下,保证了数据的安全性。...

    Android数据库SQLite基本操作工程

    在这个"Android数据库SQLite基本操作工程"中,我们将深入探讨如何在Android应用中进行最基础的数据库操作:增、删、改、查。 1. **创建SQLite数据库** - 在Android中,我们通常通过继承`SQLiteOpenHelper`类来创建...

    sms.zip_Android 数据库_android_android sms_sms

    在Android操作系统中,短信数据的存储通常依赖于SQLite数据库,这是一种轻量级、关系型的数据库管理系统,适用于移动设备上本地数据存储。标题中的“sms.zip_Android 数据库_android_android sms_sms”暗示了这是一...

    android连接电脑数据库

    在Android开发中,连接电脑数据库是一项常见的任务,尤其是在进行数据同步或者测试时。这个压缩包文件包含了一系列...通过学习这些例子,开发者可以掌握到Android数据库连接的多种技术和实践策略,提升自己的开发能力。

    Android 数据库SQLite.rar

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统,适用于移动设备。SQLite被集成在Android操作系统中,为应用程序提供本地数据存储功能。本资料包"Android 数据库SQLite.rar"包含了...

    Android 实现连接MySQL数据库

    在Android应用开发中,有时需要实现与服务器端的MySQL数据库进行交互,比如用户登录、数据同步等场景。本文将详细讲解如何在Android中实现连接到MySQL数据库,以及相关的技术要点。 首先,理解基本概念:Android是...

Global site tag (gtag.js) - Google Analytics