实现跨程序数据共享

ABAP Memory ID实战:跨程序数据共享的高效实现 本文深入解析了ABAP Memory ID在SAP开发中的核心应用,作为程序间高效数据共享的‘传声筒’。通过EXPORT、IMPORT和FREE语句的实战演示,详细阐述了如何在同一会话内快速传递变量、结构及大型内表,并强调了其作用域、命名规范及内存清理等最佳实践,是提升ABAP程序性能与用户体验的关键技术。 阅读详情

我们这里先假设先有一个A应用程序,这个程序中存在一个BookStore数据库和一张Book表,

然后还有一个B应用程序,跨程序实现数据共享的意思就是,通过B程序,我们可以对A程序中Book表中的数据进行CRUD(增删改查)操作。

下面我们就一一来实现A应用程序和B应用程序。

A应用程序:DatabaseSave

B应用程序:ProviderTest

我们需要实现ProviderTest应用程序对DatabaseSave应用程序的CRUD操作。

 

Database项目GitHub地址:

https://github.com/Skymqq/DatabaseSave.git

ProviderTest项目GitHub地址:

https://github.com/Skymqq/ProvidertTest.git

 


应用程序A(DatabaseSave项目)

我们就直接引用之前创建的DatabaseSave项目文件来继续学习。

如果你没有看过之前的数据库存储项目,可以去GitHub下载一下,项目地址:

https://github.com/Skymqq/DatabaseSave.git

下载之后导入到AS中后,新建一个ContentProvider,步骤如下:

new---》other---》ContentProvider

可以看到,我们将

内容提供器命名为DatabaseProvider

authority指定为com.example.databasesave.provider

Exported属性表示是否允许外部程序访问我们的内容提供器

Enabled属性表示是否启用这个内容提供器。

将两个属性都勾上,点击Finish完成创建。

DatabaseProvider.java代码:

package com.example.administrator.databasesave;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class DatabaseProvider extends ContentProvider {

    public static final int BOOK_DIR = 0;

    public static final int BOOK_ITEM = 1;

    public static final int CATEGORY_DIR = 2;

    public static final int CATEGORY_ITEM = 3;

    public static final String AUTHORITY = "com.example.databasesave.provider";

    private static UriMatcher uriMatcher;

    private MyDatabaseHelper helper;

    static {
        //在静态代码块中对UriMatcher进行初始化操作,并将期望匹配的几种URI格式添加进去
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(AUTHORITY, "book", BOOK_DIR);
        uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM);
        uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);
        uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);
    }

    @Override
    public boolean onCreate() {
        //完成创建、升级 BookStore数据库
        helper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);
        return true;
    }


    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        //查询数据
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = null;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                cursor = db.query("Book", projection, "id = ?", new String[]{bookId}, null, null, sortOrder);
                break;
            case CATEGORY_DIR:
                cursor = db.query("Category", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                cursor = db.query("Category", projection, "id = ?", new String[]{categoryId}, null, null, sortOrder);
                break;
            default:
                break;
        }
        return cursor;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //添加数据
        SQLiteDatabase db = helper.getWritableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
            case BOOK_ITEM:
                long newBookId = db.insert("Book", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
                break;
            case CATEGORY_DIR:
            case CATEGORY_ITEM:
                long newCategoryId = db.insert("Category", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        //更新数据
        SQLiteDatabase db = helper.getWritableDatabase();
        int updateRows = 0;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                updateRows = db.update("Book", values, selection, selectionArgs);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                updateRows = db.update("Book", values, "id = ?", new String[]{bookId});
                break;
            case CATEGORY_DIR:
                updateRows = db.update("Category", values, selection, selectionArgs);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                updateRows = db.update("Category", values, "id = ?", new String[]{categoryId});
                break;
            default:
                break;
        }
        return updateRows;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        //删除数据
        SQLiteDatabase db = helper.getWritableDatabase();
        int deleteRows = 0;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                deleteRows = db.delete("Book", selection, selectionArgs);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                deleteRows = db.delete("Book", "id = ?", new String[]{bookId});
                break;
            case CATEGORY_DIR:
                deleteRows = db.delete("Category", selection, selectionArgs);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                deleteRows = db.delete("Category", "id = ?", new String[]{categoryId});
                break;
            default:
                break;
        }
        return deleteRows;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.databasesave.provider.book";
            case BOOK_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.databasesave.provider.book";
            case CATEGORY_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.databasesave.provider.category";
            case CATEGORY_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.databasesave.provider.category";
        }
        return null;
    }


}

MyDatabaseHelper.java代码:

package com.example.administrator.databasesave;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private Context context;

    public static final String CREATE_BOOK = "create table Book(" +
            "id integer primary key autoincrement," +
            "author text," +
            "price real," +
            "pages integer," +
            "name text)";

    public static final String CREATE_CATEGORY = "create table Category(" +
            "id integer primary key autoincrement," +
            "category_name text," +
            "category_code integer)";

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.context = context;
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);//执行sql语句创建Book表
        db.execSQL(CREATE_CATEGORY);//执行sql语句创建Category表
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}

 

AndroidManifest.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.databasesave">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <provider
            android:name=".DatabaseProvider"
            android:authorities="com.example.databasesave.provider"
            android:enabled="true"
            android:exported="true"></provider>
    </application>

</manifest>

现在这个DatabaseSave项目已经拥有了跨程序共享数据的功能了,再此,我们先将之前运行在模拟器上的DatabaseSave应用卸载,再重新安装应用,以防止之前的项目文件对我们造成干扰。

 

 


应用程序B(ProviderTest项目)

下面我们再新建一个ProviderTest项目,我们希望通过这个新建的项目去访问DatabaseSave项目中的数据,从而实现跨程序共享数据的功能。

activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Data To Book"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query Data From Book"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update Book"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete Data From Book"
        android:textAllCaps="false"
        android:textSize="18sp"
        android:textStyle="bold" />


</LinearLayout>

MainActivity.java代码:

package com.example.administrator.providertest;

import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private Button btn_add, btn_query, btn_update, btn_delete;
    private String newId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化UI控件
    }

    private void initView() {
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_query = (Button) findViewById(R.id.btn_query);
        btn_update = (Button) findViewById(R.id.btn_query);
        btn_delete = (Button) findViewById(R.id.btn_delete);

        btn_add.setOnClickListener(this);
        btn_query.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_add:
                add();//添加数据
                Toast.makeText(this, "add successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_query:
                query();//查询数据
                Toast.makeText(this, "query successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_update:
                update();//更新数据
                Toast.makeText(this, "update successfully", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_delete:
                delete();//删除数据
                Toast.makeText(this, "delete successfully", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
    }


    private void add() {
        Uri uri = Uri.parse("content://com.example.databasesave.provider/book");
        ContentValues cv = new ContentValues();
        cv.put("name", "A Clash of Kings");
        cv.put("author", "George Martin");
        cv.put("pages", 1040);
        cv.put("price", 22.85);
        Uri newUri = getContentResolver().insert(uri, cv);
        newId = newUri.getPathSegments().get(1);
    }

    private void query() {
        Uri uri = Uri.parse("content://com.example.databasesave.provider/book");
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String author = cursor.getString(cursor.getColumnIndex("author"));
                int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                double price = cursor.getDouble(cursor.getColumnIndex("price"));
                Log.e(TAG, "book name is " + name);
                Log.e(TAG, "book author is " + author);
                Log.e(TAG, "book pages are " + pages);
                Log.e(TAG, "book price is " + price);
            }
            cursor.close();
        }
    }

    private void update() {
        Uri uri = Uri.parse("content://com.example.databasesave.provider/book/" + newId);
        ContentValues cv = new ContentValues();
        cv.put("name", "A Storm of Swords");
        cv.put("pages", 1216);
        cv.put("price", 24.05);
        getContentResolver().update(uri, cv, null, null);
    }

    private void delete() {
        Uri uri = Uri.parse("content://com.example.databasesave.provider/book/" + newId);
        getContentResolver().delete(uri, null, null);
    }
}

运行ProviderTest应用程序:

1.添加数据

在PrioviderTest中点击Add Data To Book按钮向Book表中添加数据

使用adb shell查看Book表中的数据如下:

 

2.查询数据:

在PrioviderTest中点击Query Data From Book按钮从Book表中查询数据:

ProviderTest中的Logcat将Book表中查询出来的数据打印:

 

3.更新数据:

在PrioviderTest中点击Update Data 按钮更新Book表中的数据:

Logcat打印:

未更新前的数据:

更新后的数据:

4.删除数据:

在PrioviderTest中点击Delete Data From Book按钮删除Book表中的数据:

adb shell查看Book表中是否还有数据:

说明我们的删除功能也是可以使用的。

 

跨程序共享数据的CRUD操作,基本上就这些。

 

 

SAP ABAP内存管理指南:如何用EXPORT/IMPORT实现跨程序数据共享(附完整示例代码) 本文深入解析SAP ABAP中EXPORT/IMPORT与SPA/GPA两种核心内存管理机制,详细对比其作用域、生命周期及适用场景。通过完整示例代码,指导开发者如何实现跨程序数据共享,包括传递复杂结构及与选择屏幕集成,并提供了构建健壮数据交换层的架构建议与最佳实践。 阅读详情

相关推荐

[《第一行Android代码》读书笔记] 第7章 跨程序共享数据——探究内容提供器

第七章 跨程序共享数据——探究内容提供器 ​ 数据持久化技术,包括文件存储、SharedPreferences存储以及数据库存储,都只能在当前应用程序中访问。跨程序数据共享需要用到另一种技术——内容提供器。 7.1 内容提供器简介 ​ 内容提供器(Content Provider)主要用于不同的应用程序之间实现数据共享的功能,同时保证被访数据的安全性,是实现跨程序共享数据的标准方式。 7.2 运行时权限 ​ Android权限机制作用比较有限,容易出现“店大欺客”现象。因此在Android 6.0引入运行时权限。 7.2.1 Android权限机制详解 ​ 为了访问系统的网络状态以及

操作系统c语言两个进程制约且互斥,操作系统——互斥的定义及实现

一、进程互斥的定义所谓进程互斥,指的是对某个系统资源,一个进程正在使用它,另外一个想用它的进程就必须等待,而不能同时使用 。进程互斥是多道程序系统中进程间存在的一种源于资源共享的制约关系,也称间接制约关系,主要是由被共享资源的使用性质所决定的。 二、互斥访问的划分 三、进程互斥遵循的原则空则让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入。忙则等待:不允许两个以上的进程同时进入互斥区,当已...

weixin_33902301的博客 616

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

C语言 多线程使用说明4 互斥对象实现线程同步-引入篇

没人看c我就不写c了吗?Too naive. 互斥对象又叫做mutex,属于内核对象,能够确保线程对于单个资源的互斥访问权,互斥对象包含一个数量,一个线程ID,和一个计数器。其中ID用于标识系统中哪个线程当前占有互斥对象,计数器指明当前线程拥有过互斥对象的次数。 互斥对象保护了共享资源,确保共享资源在一个线程访问完毕之后才能被其他线程访问。线程对于共享资源进行操作前要先申请得到互斥对象的所有权...

Xuefen's happyland 1087

从光耦隔离到稳定驱动:信捷伺服与STM32的硬件设计陷阱与救赎

本文深入探讨了信捷伺服驱动器与STM32微控制器配合时的硬件设计关键问题,包括光耦隔离电路选型、电源电压选择、拨码开关设置等核心环节。针对伺服驱动器的稳定驱动需求,提供了从电路设计到抗干扰策略的完整解决方案,帮助工程师规避常见陷阱,提升工业控制系统的可靠性。

gold8的专栏 310

STM32 超声波模块输入捕获测距(标准库)

通道2设置为下降沿触发,触发瞬间会将CNT的记录到CCR2中,由于上升沿触发时已经将CNT置零所以此时的CNT的值就是高电平的持续时间。通道1设置为上升沿触发,触发的瞬间会将CNT的值记录到CCR1里面,同时设置通道1触发带有从模式,并把从模式设置为置零CNT。超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)。输入捕获原理可以看看这位大佬,感觉写的很清楚,工作电压与电流:5V,15mA。感测角度:不小于15度。

qq_62425900的博客 2082

同步和互斥的区别

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 ...

weixin_43217065的博客 3228

QT串口通信控制LED上位机开发教程

串口通信是嵌入式系统与PC端交互的基础技术,通过UART协议实现设备间的数据传输。QT框架提供了跨平台的串口编程支持,结合其GUI模块可以快速开发上位机控制程序。在工业自动化和物联网领域,这种上下位机架构广泛应用于设备监控和控制场景。本案例展示了如何使用QT的SerialPort模块实现LED控制功能,包含串口参数配置、指令发送等核心功能实现,为嵌入式GUI开发提供实践参考。

weixin_42598278的博客 582

C语言线程同步详解(互斥锁、信号量、条件变量和读写锁)

在多线程编程环境中,当多个线程并发访问共享资源(如全局变量、内存缓冲区、文件句柄等)时,如果没有适当的同步控制,就会引发一系列严重问题。最典型的就是数据竞争(Data Race)问题,这种情况发生在至少两个线程同时访问同一内存位置,且至少有一个线程执行写操作时。因此,线程同步是保证多线程程序正确运行的基石,开发者必须充分理解其原理并合理应用各种同步机制。

Made In SQL 1415

Python爬虫实战:爬取国家气象局台风路径数据的完整教程

国家气象局(如中国气象局)一般会在官方网站公布台风的实时路径,包括台风编号、名称、时间点、经纬度、中心气压、最大风速等信息。这些数据以图形和表格的形式呈现,有时以JSON或CSV文件形式下载。爬取这类数据,有助于构建台风数据库、历史路径分析、趋势预测等应用。本文详细介绍了如何通过Python爬取国家气象局发布的台风路径数据,涵盖了数据采集、解析、存储和可视化全流程。通过实践,你可以构建自己的台风数据库,结合机器学习开展路径预测和风险评估等高级分析。后续可结合深度学习技术,实现台风轨迹预测;

2201_76125261的博客 1022

【Unity】【2D】用连续图片生成动画Animation的简明步骤

本文介绍了Unity中使用2D连续图片制作2D动画Animation的简明步骤。

O青草O的博客 Unity和游戏制作知识分享 714

C语言实现应用 Peterson 算法原理设计实现共享内存互斥

代码链接:https://gitee.com/hurq5/os-labwork/blob/master/LabWeek14/code/peterson_shm.c 应用 Peterson 算法原理设计实现共享内存互斥。 1. 相关知识点:Peterson算法 简单介绍: Peterson算法是一种用于互斥的并发编程算法,该算法允许两个或多个进程共享一次使用的资源而不会发生冲突,仅使用共享内存进行通信。 算法实现: 该算法使用两个变量flag和turn。一个flag[n]的值true表示进程n想进入临

yoyo_hu的博客 2549

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 336

Android使用内容提供器(ContentProvider)实现跨程序数据共享

Android使用内容提供器(ContentProvider)实现跨程序数据共享

Android应用开发工程师 2422

【Windows Server 2019】活动目录 (Active Directory) ——理论

博文介绍了活动目录 (Active Directory) 的定义,作用以及与 DNS 的关系。同时也介绍了AD的组织结构,包括域控制器,子域,对象,属性,容器,组织单位,域间信任等术语的解释,实验拓扑图。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 7746

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android 实现跨程序数据共享栗子

直接上代码public class DatabaseProvider extends ContentProvider { public static final int BOOK_DIR = 0; public static final int BOOK_ITEM = 1; public static final int CATEGORY_DIR = 2; publi

在路上的大蜗牛 526

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

终极指南:Kitty终端Wayland下如何实现高效安全的跨程序数据共享

对于每天沉浸在终端环境的开发者来说,高效的跨程序数据共享是提升工作流的关键。Kitty作为一款跨平台、GPU加速的终端模拟器,在Wayland显示协议下提供了多种安全便捷的数据交换方式。本文将详细介绍如何在Kitty终端中利用剪贴板、拖放功能和远程文件传输实现无缝数据共享,让你的终端工作流更加流畅高效。 ## 认识Kitty终端的Wayland数据共享架构 Kitty终端深度整合了Waylan

gitblog_00278的博客 478

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android: 实现跨程序数据共享

简单起见,我们还是在上一章中 DatabaseTest 项目的基础上继续开发,通过内容提供器 来给它加入外部访问接口。 打开 DatabaseTest 项目,首先将 MyDatabaseHelper 中使用 Toast 弹出创建数据库成功的提示去除掉,因为跨程序访问时我们不能直接使用 Toast。然后添加 一个 DatabaseProvider 类,代码如下所示:  public clas...

weixin_34107955的博客 331

Content Provider实现跨程序数据共享

自定义Content Provider 本次项目代码在实践–升级数据库最佳写法这篇博客的基础上增加的。 需要自定义Content Provider的代码如下: public class MyDatabaseProvider extends ContentProvider { public static final int BOOK_DIR=0; public static final

Hate Bugs 589

Android实现跨程序数据共享,Android 跨应用共享数据01-SharedPreferences

Android 有四大存储方式:sqlite 、File、SharedPreferences、ContentProvider,而说到跨应用之间的数据共享,很多人可能会想到用ContentProvicer,不过个人觉得ContentProvider还是有点麻烦,如果可以,不妨试试SharedPreferences。下面主要讲解使用SharePreferences跨应用共享数据的用法,关于Andro...

weixin_33726568的博客 1129

【Android】探究ContentProvider、运行时申请权限的做法、访问其他程序中的数据、创建自己的ContentProvider、实现跨程序数据共享并且解决存在的权限问题导致无法访问。

探究ContentProvider、运行时申请权限的做法、访问其他程序中的数据、ContentResolver的基本用法、创建自己的ContentProvider、实现跨程序数据共享并且解决存在的权限问题导致无法访问。解决第一行代码中实现跨数据共享的应用。无法访问应用1的问题。

摸鱼小小虫的博客 2860

第一行代码 第7章 内容提供器 --实现跨程序数据共享

DatabaseTest.apk源码如下:MainActivity.javapublic class MainActivity extends AppCompatActivity implements View.OnClickListener { private MyDatabaseHelper myDatabaseHelper; @Override protected void

小猴爷 507

Android基础之ContentProvider实现跨程序(进程)数据共享 | 带源码

Android基础之ContentProvider实现跨程序(进程)数据共享 | 第一行代码学习 | 带源码

Qricis的博客 631

Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo) ...

本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下: 跨程序共享数据——Content Provider 之 运行时权限解析以及申请的实现(可完美解决java.lang.SecurityException:Permission De...

测试0901-1 153

Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)

本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下: 跨程序共享数据——Content Provider 之 运行时权限解析以及申请的实现(可完美解决java.lang.SecurityException:Permission Denial 问题) 跨程序共享数据——Conte...

aaLiweipeng的博客 305

第一行代码学习笔记:跨程序共享数据----内容提供器

简介内容提供器主要用在不同程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使用内容提供器是Android实现跨程序数据共享的标准方式。内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。...

zsp45212的专栏 519
上一篇: 创建自己的内容提供器
下一篇: 重学《Java从入门到精通》第四版 清华大学出版社
Android_牧
博客等级 码龄9年 88粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值